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)
我可以看到使用varaka" Local type-inference "的一个缺点:
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的时间,我会自己回答.