真疯了!Java 9 还没会用,Java 10 就要来了!
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握手机制
本文,主要来介绍一个特性:本地变量类型推断。因为他将改变你写代码的方式。
什么是本地变量推断
他其实是一个新的语法糖,在我的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变量会使代码可读性变得更糟,但此次的新特性为开发者提供了一种在编写复杂表达式的时候寻求了一个新的契机。
∞∞∞∞∞
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 2. Bean Validation声明式校验方法的参数、返回值
- 如何识别和阻止基于电报的僵尸网络
- 由String,String Builder,String Buffer 引起的面试惨案
- MySQL案例:各类临时文件的存放位置
- 关于加@Transactional注解的方法之间调用,事务是否生效的问题
- 基于Vue实现一个有点意思的拼拼乐小游戏
- 硬核手写字节码实现HelloWorld
- 由 go orm 引发的探索
- 为什么不建议在 for 循环里捕捉异常?
- 我就是想找个下标,怎么用到二分查找了?
- 利用Decorator和SourceMap优化JavaScript错误堆栈
- 【每日一题】43. Multiply Strings
- extjs 为组件动态添加插件
- logback使用异步输出日志
- 守护进程