“的优点/缺点”;var";在Java10中
当然,“的优点/缺点”;var";在Java10中,java,java-10,Java,Java 10,当然,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>
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
}
}
import java.util.HashMap;
公开课考试{
公共静态void main(字符串[]args){
var x=newhashmap();//合法
var y=new HashMap();//合法
var z=“soner”;//合法
系统输出打印ln(z);
var umm=null;//xx错误xx//
var foo;//xx没有初始值设定项xx时使用错误//
var=5;//合法
}
}
我知道一个原因,我们在项目中实际使用了它。只要有一个变量是“大”的,我们就用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();
}
您也可以将其用于匿名类,即没有要声明的类型。例如
var r = new Runnable()
{
int result1, result2;
@Override public void run()
{
result1 = doStuff();
result2 = doMoreStuff();
}
}
makeSomething(r);
System.out.println(r.result1 * r.result2);
我可以看到使用
var
aka“本地类型推断”的一个缺点:
在这种情况下,您需要检查getInstance(String)
方法的签名,以了解什么是y
类型
编辑:
因为有一个关于我的变量名称不正确的讨论,所以让我们使用一些真实的例子
var sDate = "20180426";
var date = DateUtil.getDate(sDate);
日期是什么类型的
我可以打电话
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);
注意:如果我使用var
,有人能告诉我这是否需要导入LocalDate
(请注意,我在另一个类中使用了一个方法,因此我从未在这个类中声明过LocalDate
。如果我有时间安装JDK10,我会回答自己。关于java-10的var,这里有很多存在的问题:)短版本,这是一些语法糖,可以防止
Map y=new HashMap()的冗长代码>基本上。我相信这将在编译期间被替换。“var”是关于同一方法中的类型推断。从我的观点来看,我建议不要使用它,因为你的代码在可读性方面损失太多,而这是不应该发生的事情,Stuart实际上写了一些实践,其中包括大多数用例,人们会根据自己的意见在回答中选择这些用例。因为让CreateEmailDesignTransactionSync作业
为代码的其余部分更改一些内容@DamCx?在声明过程中需要使用var
进行初始化,这样可以保留可读性,因为您总是使用构造函数类型。我没有想到使用var
来声明这样的匿名类型。这很好。@很明显,如果你想在匿名类型中使用一些非常智能的东西,请看这个例子,我会支持在例子中选择变量名的错误想法。我的记忆中有点模糊,但我记得斯图尔特在@Arundev中的一句类似的话,你是说var
?如果是,是的。你的观点是什么?那就不要叫它y
。)公平地说,即使它被称为instance
,它也不会告诉我们太多变量的类型…@AdrienBrunelat它应该被命名为getInstance
的返回类型在这种情况下是用于x
。这是故意使用坏名称@Nicolai的错误做法。最好的例子是,如果我称之为date
,它是java.sql.date
,java.util.date
还是java.time.LocalDate
。我总是根据需要使用前缀/后缀来调用那些date
。我添加了一个正确名称的示例,但仍然指向问题@nullpointer。
var sDate = "20180426";
LocalDate date = DateUtil.getDate(sDate);