Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“的优点/缺点”;var";在Java10中_Java_Java 10 - Fatal编程技术网

“的优点/缺点”;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);