2017年8月,JCP执行委员会提出将Java的发布频率改为每六个月一次,随后,Oracle发言人Donald Smith在他的博客中确认了这一消息。该决定将在Java 9正式发布之后开始实行,也就是说,Java的下一个发布日期是2018年3月。
新的发布周期严格遵循时间点,将在每年的3月份和9月份发布。与现在的发布周期不同,新的发布计划不会为了等待某个主要特性完成而延期。如果一个特性还没有完成,它就不会被合并到发布用的代码仓库里。如果错过了一个版本,就要等待下一次发布。在此之前,Java 8也因为安全问题延期了8个月左右,Java 9因为模块化系统(Jigsaw)问题一再延期,比预期晚了18个月发布。
也就是说,作为一个Java开发,你使用的编程语言,每半年都会有一个新的版本出来。这无疑是一件好事儿。
随着新技术的不断退出,对于开发者的挑战也就越来越大。像我在我的文章中多次提到过的观点:作为一个开发人员,最大的挑战就是如何保证自己了解新的技术。好在你现在关注了Hollis,我会和你一起学习这些新技术。
按照上面提到的Java发布进度,Java 10将于本月发布。因为Java 10的时间线较短,范围也相对较小,所以Java 10的变更将通过JEP进行跟踪。
有望被包含在Java 10中的特性是那些已经处于Targeted或Proposed状态的JEP,它们包括:
286:本地变量类型推断 296:统一JDK仓库 304:垃圾回收器接口 307:G1的并行Full GC 310:应用程序类数据共享 312:ThreadLocal握手机制
本文,主要来介绍一个特性:本地变量类型推断。因为他将改变你写代码的方式。
PS:Java 10马上就要发布了,Java 8你已经开始用了么?Java 9的特性你了解了么?给你推荐一本书《Java编程的逻辑》。Hollis会送出三本,具体获取方式见文末。
什么是本地变量类型推断
他其实是一个新的语法糖,在我的GitChat《深入分析Java语法糖》中我详细介绍过目前Java中的所有语法糖及其背后的原理。Java现在在逐渐往多糖语言转变,从Java 7开始便有意的开始加入语法糖。同样,为了方便和简化开发,Java 10将提供一个新的语法糖——本地变量类型推断。
类型推断,并不是Java语言独有的特性,许多流行的编程语言,比如C++, C#以及Go,在定义过程中,都提供一种局部变量类型推断的功能(例如C++提供了auto 关键字,C#提供var关键字)。
在当前版本的Java中,我们想定义定义局部变量时。我们需要在赋值的左侧提供显式类型,并在赋值的右边提供实现类型,如下面的片段所示:
MyObject value = new MyObject();
List
list = new ArrayList ();
在Java 10中,你可以这样定义对象:
var value = new MyObject();
var list = new ArrayList
();
正如你所看到的,本地变量类型推断将引入“var
”关键字,而不需要显式的规范变量的类型。
很简答,如果你只是想单独的使用这个特性,就在你定义局部变量的时候引入var
关键字就可以了。至于他背后的实现原理,我会单独开一篇文章来解语法糖。
背后的故事
在JEP 286诞生之前,Oracle曾做过一个调查,主要是想看看社区对于这一特性的反应。
第一个调查是:你认为Java引入局部变量的类型推断咋样?
第二个调查是:你希望使用哪个关键字来定义变量?
从上面的两个调查,我们可以知道,这一特性是受到广大开发者欢迎的,因为他确实方便了很多。
他将如何影响我的代码
当一个新特性来临的时候,我们首先要问自己一个问题:这将如何影响我的代码? 下面我们来看下这一特性可以使用在哪些场景中,以及在哪些场景中不能使用。
适用范围:
-
初始化局部变量
- 一定是初始化的时候,只是定义是不可以的。如
var foo;
不可以,但是var foo = "Foo";
可以。
- 一定是初始化的时候,只是定义是不可以的。如
-
增强for循环的索引
- 如
for (var nr : numbers)
- 如
-
传统for循环的局部变量定义
- 如
for (var i = 0; i < numbers.size(); i++)
- 如
不适用范围:
- 方法的参数
- 构造函数的参数
- 方法的返回值类型
- 对象的成员变量
- 只是定义定义而不初始化
总结
在Java 10之后你在声明局部变量类型的时候可以使用var来告知编译器进行类型推断。这仅仅发生在变量初始化的阶段,就像 var s = "";这样。 此外,也可以是用在普通for循环和增强for循环中。
除了局部变量之外,另外在属性和方法返回值类型中,不能使用var。 这样做是为了避免引起一些无法预知的错误。
尽管引入var变量会使代码可读性变得更糟,但此次的新特性为开发者提供了一种在编写复杂表达式的时候寻求了一个新的契机。
福利
好了,到了福利时间。关注微信公众号(hollischuang)了解详情
又要学新知识了
aaa
用了这个语法糖之后,你 review code 总是不能直接看定义左边的类型,而是要从右边的构造出推断,个人感觉不是很方便;再就是在定义处编译器检查左右边是否相同类型的功能被废掉了,而是在后面的代码你才会意识到类型可能定义错了