局部变量类型推断
很多人抱怨 Java 是一种强类型,需要引入大量的样板代码。甚至在这些情况下,给定好变量名,通
常很清楚发生了什么,明显类型声明往往被认为是不必要的。许多流行的编程语言都已经支持某种
形式的局部变量类型推断:如 C++ (auto), C# (var), Scala (var/val), Go (declaration
with :=)等。
JDK10 可以使用 var 作为局部变量类型推断标识符,此符号仅适用于局部变量,增强 for 循环的索
引,以及传统 for 循环的本地变量;它不能使用于方法形式参数,构造函数形式参数,方法返回类
型,字段,catch 形式参数或任何其他类型的变量声明。
标识符 var 不是关键字;相反,它是一个保留的类型名称。这意味着 var 用作变量,方法名或则包
名称的代码不会受到影响;但 var 不能作为类或则接口的名字(但这样命名是比较罕见的,因为他
违反了通常的命名约定,类和接口首字母应该大写)。
参考一下示例:
var str = "ABC"; //根据推断为 字符串类型
var l = 10L;//根据 10L 推断 long 类型
var flag = true;//根据 true 推断 boolean 类型
var flag1 = 1;//这里会推断 boolean 类型。0 表示 false 非 0 表示 true
var list = new ArrayList<String>(); // 推断 ArrayList<String>
var stream = list.stream(); // 推断 Stream<String>
反编译 class 文件:
String str = "ABC";long l = 10L;boolean flag = true;int flag1 = true;
ArrayList<String> list = new ArrayList();
Stream<String> stream = list.stream();
从上面示例可以看出,当我们是用复杂的方法时,不需要特意去指定他的具体类型返回,可以使用
var 推断出正确的数据类型,这在编码中,可以大幅减少我们对方法返回值的探究。
将 JDK 多存储库合并为单存储库
为了简化和简化开发,将 JDK 多存储库合并到一个存储库中。多年来,JDK 的完整代码已经被分解
成多个存储库。在 JDK9 中有八个仓库:root、corba、hotspot、jaxp、jaxws、jdk、langtools
和 nashorn。在 JDK10 中被合并为一个存储库。
虽然这种多存储库模型具有一些有点,但它也有许多缺点,并且在支持各种可取的源代码管理操作
方面做得很差。特别是,不可能在相互依赖的变更存储库之间执行原子提交。例如,如果一个 bug
修复或 RFE 的代码现在同时跨越了 jdk 和 hotspot 存储库,那么对于两个存储库来说,在托管这两
个不同的存储库中,对两个存储库的更改是不可能实现的。跨多个存储库的变更是常见。