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 编程的逻辑, 让你在学习 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 变量会使代码可读性变得更糟, 但此次的新特性为开发者提供了一种在编写复杂表达式的时候寻求了一个新的契机
来源: https://mp.weixin.qq.com/s/2L6y8HTvYqhA3EWDHwYEYw