介绍
JDK 10
JDK 10新增了新的关键字——var, 官方文档 说作用是:
Enhance the Java Language to extend type inference to declarations of local variables with initializers
大体意思就是用于带有初始化的局部变量声明,废话不多说,我们直接用具体代码来展示实际的作用。
List<String> listBefore10 = new ArrayList<>(); # 在JDK10之前 var listAfter10 = new ArrayList<String>(); # 在JDK10之后 listBefore10.add("9"); listAfter10.add("10");
JDK 11
JDK 11对var做了调整,允许var关键字用于Lambda函数里面的参数类型声明,示例:
var result = Arrays.asList("Java", "11").stream().reduce((var x, var y) -> x + y); System.out.println(result.orElseThrow());
原理
可以看到使用了var关键字后,节省了一点声明内容,但是仔细一看,例如一个泛型类型从声明部分,挪到了初始化部分去了。我们直接看反编译后的class文件:
可以看到,其实var关键字对于我们来说就是一个语法糖,编译完成后var声明的变量类型已经确定下来了,实际运行的时候是无法起到类似于Javascript语言var声明变量后还能动态更换类型的效果。至于为什么使用必须同时声明和初始化的方式,而不是先声明,后初始化再进行类型推断的方式,官方大体是基于下面考虑的
The majority (more than 75% in both JDK and broader corpus) of local variables with initializers were already effectively immutable anyway, meaning that any "nudge" away from mutability that this feature could have provided would have been limited.
超过75%的JDK库及其相关扩展中,带有初始化的局部变量,都是有效不可变的,即使提供了延后初