Java 10中"var"的优点/缺点

snr*_*snr 3 java java-10

AFAIK,var不是Java中的关键字.它是保留类型名称.我想知道在什么情况下我们应该使用/避免它.它的用法是否有原则?

import java.util.HashMap;

public class Test {
    public static void main(String[] args) {
        var x = new HashMap<> (); // legal
        var y = new HashMap<String, Integer>(); // legal

        var z = "soner"; // legal
        System.out.println(z);

        var umm = null;  // xx wrong xx //
        var foo; // xx wrong usage without initializer xx //

        var var = 5; // legal

    }
}
Run Code Online (Sandbox Code Playgroud)

Eug*_*ene 12

我知道一个原因,我们实际上在我们的项目中使用.每当有一个"大"的变量时,我们用var替换它.例如:

 public void test(){
     CreateEmailEsignTransactionAsync job = new CreateEmailEsignTransactionAsync(... some input);

     // vs 
     var job = new CreateEmailEsignTransactionAsync(... some input)
 }
Run Code Online (Sandbox Code Playgroud)

我发现第二个例子更具可读性,这就是我们主要使用它的方式.

还有另一个例子可以使用它(但到目前为止我还没有使用它).以前这可以通过链接仅用于lambda表达式,例如,因为这只是编译器已知的类型 - 它们无法声明.

 public void test() {
        var test = new Object() {
            public void go() {

            }
        };

        test.go();
    }
Run Code Online (Sandbox Code Playgroud)

  • 因为拥有`CreateEmailEsignTransactionAsync job`会改变其余代码@DamCx的内容吗?在声明期间需要使用`var`进行初始化,因此保留了可读性,因为您始终具有构造函数类型. (3认同)
  • @Strikege好,如果你想要一些非常智能的匿名类型,请参阅/sf/ask/3484790151/索引的最-MAX-流元件/ 49802582#49802582 (2认同)
  • 我会想到示例中变量名称选择不当的想法.在我的记忆中略微褪色但我记得在[LVTI风格文档]中来自Stuart的类似行(http://openjdk.java.net/projects/amber/LVTIstyle.html) (2认同)

Axe*_*elH 9

我可以看到使用varaka" Local type-in​​ference "的一个缺点:

var x = "A";
// String x
var y = getInstance(x);
//? y
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您需要检查getInstance(String)方法的签名以了解将要y键入的内容.

编辑:

由于有关于我的变量名称不是真正正确的讨论,让我们使用一些真实的例子.

 var sDate = "20180426";
 var date = DateUtil.getDate(sDate);
Run Code Online (Sandbox Code Playgroud)

什么类型date

我可以打电话

 public static java.util.Date getDate(String);
 public static java.sql.Date getDate(String);
 public static java.time.LocalDate getDate(String);
Run Code Online (Sandbox Code Playgroud)

我不相信解决方案也是使用全名.

 var javaUtilDate
 var javaSqllDate
 var javaTimeLocalDate
Run Code Online (Sandbox Code Playgroud)

所以相反,在这种情况下,我不会使用类型推断

var sDate = "20180426";
LocalDate date = DateUtil.getDate(sDate);
Run Code Online (Sandbox Code Playgroud)

注意:有人可以告诉我这是否需要导入LocalDate如果我使用var(注意我在不同的类中使用方法,所以我从来没有必须LocalDate在这个类中声明).
如果我找到安装JDK10的时间,我会自己回答.

  • 那不要叫它``` ;) (2认同)
  • 这当然是故意使用坏名字@Nicolai。最好的例子是,如果我称之为`date`,它是`java.sql.Date`、`java.util.Date` 甚至`java.time.LocalDate`。我总是根据需要用一些前缀/后缀来称呼那些“日期”。 (2认同)