5

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

    }
}
4

3 回答 3

18

我知道我们在项目中实际使用的一个原因。每当有一个“大”变量时,我们将其替换为 var。例如:

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

     // vs 
     var job = new CreateEmailEsignTransactionAsync(... some input)
 }

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

还有另一个可以使用它的示例(但到目前为止我还没有使用它)。以前,这可以通过链接仅用于 lambda 表达式来实现,因为这将是仅编译器知道的类型——它们不能被声明。

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

            }
        };

        test.go();
    }
于 2018-04-25T12:53:26.323 回答
17

我可以看到使用var又名“本地类型推断”的一个缺点:

var x = "A";
// String x
var y = getInstance(x);
//? y

在这种情况下,您需要检查getInstance(String)方法的签名以了解将是什么y类型。

编辑:

由于有人讨论我的变量名称并不正确,那么让我们使用一些真实的例子。

 var sDate = "20180426";
 var date = DateUtil.getDate(sDate);

什么类型date

我可以打电话

 public static java.util.Date getDate(String);
 public static java.sql.Date getDate(String);
 public static java.time.LocalDate getDate(String);

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

 var javaUtilDate
 var javaSqllDate
 var javaTimeLocalDate

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

var sDate = "20180426";
LocalDate date = DateUtil.getDate(sDate);

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

于 2018-04-25T13:08:39.383 回答
4

您也可以将它用于匿名类,即没有要声明的类型。例如

var r = new Runnable()
{
  int result1, result2;
  @Override public void run()
  {
    result1 = doStuff();
    result2 = doMoreStuff();
  }
}

makeSomething(r);
System.out.println(r.result1 * r.result2);
于 2018-04-25T13:05:28.403 回答