真疯了!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变量会使代码可读性变得更糟,但此次的新特性为开发者提供了一种在编写复杂表达式的时候寻求了一个新的契机。

∞∞∞∞∞

原文发布于微信公众号 - IT派(it_pai)

原文发表时间:2018-03-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏web前端教室

大周末的不多说,面试十点必看

实事求是的讲,前端新人因为时间的关系,对于JavaScript的理解确实是无法面面具到,甚至有些知识点我讲的比较深入,但因为每个人的程度不同,依然无法做到当堂理...

20250
来自专栏灯塔大数据

技术 | Python从零开始系列连载(十八)

可迭代对象:在之前学习的基础上,可以简单的理解为可以用for循环遍历的,如学过的list tuple dict set str

10810
来自专栏点滴积累

《类型编程晋级——shapeless类库使用指南》前言及第一章翻译

从年初开始进行此项工作,我和合作伙伴包亮付出了大量而艰辛的劳动。翻译中我们本着能够让所有人看明白、看懂的目的,反复修改高达五次。现基本翻译完毕,有出版意向,如果...

45280
来自专栏GopherCoder

『No25: 编写可读代码的艺术(2)』

根据:先处理正向逻辑,处理简单的,处理可疑或者有趣的准则,改善如下(仅仅只是调换顺序)

12020
来自专栏xingoo, 一个梦想做发明家的程序员

第一章 对象导言 第二章 对象的创建与使用

1 抽象过程 2 对象接口 3 实现隐藏 4 重用 5 继承:重用接口 6 多态性:互换对象 7 创建销毁对象 8 异常处理:应对错误 9 分析...

197100
来自专栏做全栈攻城狮

电脑编程入门(10)-C#面向对象编程浅聊,一起自学软件开发

本教程适用于给想要入门学习软件开发朋友。致力于可以帮助更多初学者,熟悉精通.Net编程开发。

15020
来自专栏C语言C++游戏编程

新手入门C语言编程:使用函数必须知道的三点注意事项!

C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。

13520
来自专栏Albert陈凯

函数式编程初探

http://www.ruanyifeng.com/blog/2012/04/functional_programming.html 诞生50多年之后,函数式编...

362100
来自专栏程序员互动联盟

【编程基础第五讲】java面向对象思想如何理解?

存在的疑惑: 如何理解面向对象的思想? 解决方案: 比如说,我们要用程序来描述一个人。如果是以往的结构化编程,我们可能会这样; 例如用C语言的话,可能会建立一个...

30340
来自专栏诸葛青云的专栏

c语言新手的无奈,几个新手容易犯的错误

如果你是一个c语言新手,你很能试过在写代码的时候看上去明明问题,但是运行的时候就出现了错误。下面的错误你犯过几个?

13810

扫码关注云+社区

领取腾讯云代金券