如果一切按计划进行(我们正在研究Jigsaw项目),那么Java 9将在不到100天的时间内启动。 您可以在此处加入倒计时以发布它。 它将包含一长串新功能和升级功能,其中一些我们迫不及待想要看到实际应用。
但是,有些功能还没有为Java 9做好准备,这就是Project Amber出现的地方,因此这些功能可以成为现实。 这是什么意思? 让我们找出答案。
专注于Var / Val,Enums和Lambda
Java语言架构师Brian Goetz于去年1月首次提出了Amber项目,当时他提出创建一个项目来探索和孵化较小的,面向生产力的Java语言功能。
成为该项目一部分的功能的主要前提条件:已被接受为候选JEP,也称为JDK增强建议。 在此过程中,Oracle收集了有关Java开发工具包和OpenJDK增强功能的建议。 批准的提案将继续成为Java的实际功能。
Goetz指出,这个项目不是思考或讨论改进Java的新想法和随意想法的地方,并且“整个Internet仍然可以使用”。
3月16日,Goetz 欢迎Amber项目进入Java社区,并通过了前三个Java增强提案:
– 局部变量类型推断(JEP 286) –使用初始化程序将类型推断扩展到局部变量的声明
– 增强枚举(JEP 301) –使枚举更好的功能
– Lambda剩菜(JEP 302) –改善lambda的可用性
为什么这三个项目受到如此特别的关注? 让我们找出答案。
满足琥珀项目的新功能
局部变量类型推断
大多数开发人员对Java的主要问题之一是它太冗长。 虽然在阅读并尝试理解编写函数时其他开发人员的想法时这可能是一件好事,但在实际编写这些函数时可能会很乏味。
此功能建议向Java添加一些语法糖以简化它。 这将允许声明变量而不必指定关联的类型。 例如,这:
List<String> list = new ArrayList<String>();
final Stream<String> stream = getStream();
将被替换为:
var list = new ArrayList<String>();
val stream = getStream();
如果您想了解有关此功能的更多信息,以及社区对此有何看法,请查看我们的Java新本地变量类型推断语言功能动手概述 。
增强枚举
此功能的目标是增强Java语言中的枚举构造的表达能力。 如提案中所述,Java枚举是功能强大且常用的构造。 它们允许对常数进行分组,其中每个常数都是一个单例对象。 当变量必须等于为其预定义的值之一时,它将使变量成为一组预定义的常数。 例如,星期几。
增强功能将允许枚举类型变量(泛型支持),从而可以扩展枚举。 它还将对枚举常量执行更清晰的类型检查,以验证和强制执行枚举约束。
具有泛型支持的枚举将使我们能够指示键集及其关联的类型,并且我们能够向单个项目添加方法。 这两个功能将协同工作,以使枚举常量能够承载特定于常量的类型信息以及特定于常量的状态和行为。 增强的枚举将使我们能够使用通用类型定义枚举。 当表示数学常数时,可以显示此功能某些值的示例:
public enum MathematicalConstants < T > {
E < Double > (Math.PI),
PI < Double > (Math.E),
ZERO < Integer > (0),
ONE < Integer > (1),
i < Complex > (new Complex(0, 1))
private MathematicalConstants(T underlyingObject) {
this.underlyingObject = underlyingObject;
}
}
在此示例中,我们可以添加对其他方法的支持,同时仍然享受每种方法的类型安全性。 当底层对象不必是对象类型时,可以将不同类型传递给枚举的构造函数,这展示了此功能可以带来的优雅。
增强枚举的另一个有用应用是减少在不同数据类型之间转换的样板代码。 例如,jdbc类型转换为Java类型。 它可以帮助提高我们的代码自我记录的能力,并避免像“ instanceOf”检查那样的代码气味。
Lambda剩菜剩饭
Project Lambda于2014年随Java 8一起发布,但总有改进的余地。 这里的想法是通过增强方法上下文中函数表达式的歧义性来提高lambda表达式和方法引用的可用性。
此功能还着重于完成下划线字符的修复以指示未使用的lambda参数,并允许lambda参数对封闭范围中的阴影变量。
使用下划线作为未命名的lambda参数的符号的概念已经在其他语言中存在,其目标是也使其成为Java的一部分。 使用非常简单,看起来像这样:
BiFunction<Integer, String, String> biss = (i, _) -> String.valueOf(i);
它为什么如此重要? 因为这将允许对未使用的参数进行更强的静态检查,并且还允许将多个参数标记为未使用。 但是,执行该选项可能很困难,因为下划线已经是有效的标识符,并且需要进行一些调整和兼容性才能使其起作用。
Java的附带项目
Project Amber加入了诸如Valhalla之类的Java长期项目,以处理不可变且无引用的对象,旨在减少GC暂停时间和XRender Graphics Pipeline的 Shenandoah ,目的是创建新的Java2D图形管道。
Lambda和Jigsaw是其中两个比较受人关注的项目。 Lambda项目是Java 8的一部分,于2014年3月引入,它将Lambda表达式和流引入Java。 Jigsaw项目即将成为Java 9的一部分,旨在使Java模块化并将JRE分解为可互操作的组件。
这两个项目都花费了大量的精力-Lambda于2009年12月首次引入,花了5年多的时间才成为Java的实际组成部分。 拼图是在2008年12月推出的,随后进行了将近9年半的工作。
这不一定意味着项目Amber将具有相同的时间表,但这很好地表明了将主要功能集成到Java中需要花费多长时间。 但是,在此项目的公告中充满了希望。
除了通常获得的邮件列表项目外,Goetz还发布了正式的回购协议。 与类似的项目不同,由于团队将处理多个JEP,因此将在分支中完成工作,而默认的JEP将同步到jdk10。 这是否意味着Amber可能会成为下一个Java版本的一部分? 我们将不得不拭目以待。
为什么是琥珀色?
如果您想知道名称及其名称,Java开发人员兼SitePoint Java部分的编辑Nicolai Parlog将这个问题发给了Brian Goetz本人。 他得到了一个简单的回答:“为什么不呢?”。
但是,Goetz建议举行比赛以提出候选人。 他亲自挑选了获胜者,并提供了以下解释:
@java @BrianGoetz @nipafx或更可能的是:琥珀在希腊语中被称为elektron,这可能意味着“阳光直射 ”(根据Wikipedia)
— Kwakeroni(@kwakeroni) 2017年3月28日
而且您必须承认这听起来很酷。
最后的想法
Java是一种具有许多功能,能力和程序员的大型语言。 Project Amber加入了已经在进行中的功能列表,所有这些功能都具有相同的目标-帮助开发阶段更快地进行,并满足Java工程师和开发人员的需求。
现在有两个主要问题– Project Amber将采用哪些其他建议,以及将它们变成Java现实需要多长时间。
翻译自: https://www.javacodegeeks.com/2017/05/project-amber-future-java-exposed.html