Java已经过了20个年头了,Java8之后,JDK的发行计划变了不少,半年一小聚,三年一大闹。根据Oracle官方的的文档,长期支持的Java版本是Java11 和 Java17。 其中Java17计划在2021年9月14号发布,Java17 将是一个长期支持的版本(Long Terms Support)。既然长期支持,作为Java程序员就必须重视并搞起来。那么让我们来阅览一下二十年陈酿 Java17 。文木附送OpenJDK 17 Earily Access 版本下载地址,还不玩起来!
1. Java 17 的个人资料 {#1-java-17-的个人资料}
Java17 由 JCP的一些成员小组于2020年12月7日 向JCP委员会提交的 JSP392 (Java Specification Requests)。当然这些组员基本都是来自各大和Java密切相关的公司。有Oracle,Azul Systems(一个只做Java 和JVM的公司,其商业产品 Zing JVM 和 C4 GC等),Eclipse Foundation ,Red Hat,SAP SE(源于德国的专业软件公司,工业软件全球领先).
下表为Java17 2021年发布计划,陆续会发布一些类似于预览的版本,最终计划在9月14发布正式版本。
| 2021/06/10 | Rampdown Phase One (fork from main line) | |------------|----------------------------------------------------------------------------------| | 2021/07/15 | Rampdown Phase Two | | 2021/08/05 | Initial Release Candidate | | 2021/08/19 | Final Release Candidate | | 2021/09/14 | General Availability |
根据Oracle的支持计划 Java 17 会一直支持到2029年。
2. Java17 都有些啥? {#2-java17-都有些啥}
目前openjdk官网已经放出了JDK 17 的一些特性。下面我们将列出一些这些新特性,并做简短解释!
2.1 JEP 306: Restore Always-Strict Floating-Point Semantics {#21--jep-306-restore-always-strict-floating-point-semantics}
主要就是简化数学类库的开发,包括java.lang.Math
and java.lang.StrictMath
.
2.2 JEP 356: Enhanced Pseudo-Random Number Generators {#22-jep-356-enhanced-pseudo-random-number-generators}
增加伪随机数接口RandomGenerator,适应基于stream操作的程序。
2.3 JEP 382: New macOS Rendering Pipeline {#23--jep-382-new-macos-rendering-pipeline}
给macOS提供一个渲染管道工具。苹果不用OpenGL了,那Java为了适应它也要慢慢的减少使用。
2.4 JEP 391: macOS/AArch64 Port {#24--jep-391---macosaarch64-port}
总结一句就是,Java 是一个跨平台的语言,那么不管什么样的系统架构,咱们都必须支持起来,苹果用户不少,咱得及时服务好。
2.5 JEP 398: Deprecate the Applet API for Removal {#25--jep-398-deprecate-the-applet-api-for-removal}
Applet类从小黑屋打入死牢,从Java9就进了小黑屋,看来很快就会和小黑屋的其他朋友们一起被移除了。终究是错付了青春!
2.6 JEP 403: Strongly Encapsulate JDK Internals {#26--jep-403-strongly-encapsulate-jdk-internals}
持续提高JDK的安全性可维护性,推荐开发者使用标准的Java API 而不使用Java的一些内部操作,可以更好的升级Java版本。看来要持续搞无缝衔接,Java想要流芳百世的说!
2.7 JEP 406: Pattern Matching for switch (Preview) {#27--jep-406-pattern-matching-for-switch-preview}
继Java16之后,又一次增强switch语句。此处概括就是,万物皆可switch。什么null,Exception,类类型皆不在话下。 国外程序员都很喜欢使用switch麽,那下一期我们安排一个switch系列。唠一唠!
先给一点switch预览喽
|------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| static String formatterPatternSwitch(Object o) { return switch (o) { case Integer i -> String.format("int %d", i); case Long l -> String.format("long %d", l); case Double d -> String.format("double %f", d); case String s -> String.format("String %s", s); default -> o.toString(); }; } static void test(Object o) { switch (o) { case null -> throw new NullPointerException(); case String s -> System.out.println("String: "+s); case Integer i -> System.out.println("Integer"); default -> System.out.println("default"); } } inteval(Expr
n)
{
return
switch(n)
{
case
IntExpr(int
i)
->
i;
case
NegExpr(Expr
n)
->
-eval(n);
case
AddExpr(Expr
left,
Expr
right)
->
eval(left)
+
eval(right);
case
MulExpr(Expr
left,
Expr
right)
->
eval(left)
*
eval(right);
default
->
throw
new
IllegalStateException();
};
}
|
2.8 JEP 407: Remove RMI Activation {#28--jep-407-remove-rmi-activation}
删除远程方法调用 (RMI) 激活机制, 移除 java.rmi.activation
包,能关小黑屋的都全部关进去。good bye!
2.9 JEP 409: Sealed Classes {#29--jep-409-sealed-classes}
Sealed 关键字在C#充当了类似于Java Final 关键字的作用。但Java拿到这个种子之后就开出了不一样的花,而且做的很Java。
sealed修饰的类和接口限制其他的类或者接口的扩展和实现。说白了就是限制类的继承或者接口的实现数量。
简单例子如下:
定义一个天体的接口
|-------------|------------------------------------------------------------------|
| 1 2
| public sealed interface Celestial permits Planet,Star,Comet { } |
那么对于接口Celestial的实现类就只能是permits 中的 Planet,Star,Comet 这三个,其他的实现类均为不允许。
|---------------|----------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3
| final class Planet implements Celestial { } final class Star implements Celestial { } final class Comet implements Celestial { } |
如果再有其他的类想要实现接口Celestial,那么编译器会提示sealed hierarchy不允许。
|---------------|-----------------------------------------------------------------------------------------------------------------|
| 1 2 3
| final class spaceShip implements Celestial { } //则会报错如下 //huispaceShip is not allowed in the sealed hierarchy |
Idea 给出的提示就是把spaceShip加回到permits list 里面。
如果再配合Java16 推出的 record 关键字一起使用,那么碰撞出的火花,自然异常精彩!下面请看:
|-----------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7
| public sealed interface Expr permits ConstantExpr, PlusExpr, TimesExpr, NegExpr { ... } publicrecord
ConstantExpr(int
i)
implements
Expr
{
...
}
public
record
PlusExpr(Expr
a,
Expr
b)
implements
Expr
{
...
}
public
record
TimesExpr(Expr
a,
Expr
b)
implements
Expr
{
...
}
public
record
NegExpr(Expr
e)
implements
Expr
{
...
}
|
record 与sealed 关键字后面会单独安排文章啦啦,目前先简单看看。敬请关注后期的内容,指北君会不定时的推送!
2.10 JEP 410: Remove the Experimental AOT and JIT Compiler {#210-jep-410-remove-the-experimental-aot-and-jit-compiler}
移除AOT提前编译和JIT即时编译的功能,Oracle JDK16 未包含此功能。很多我们未用过的功能就默默的消失了,又为我们的学习减轻了不少负担!
2.11 JEP 410: Deprecate the Security Manager for Removal {#211-jep-410-deprecate-the-security-manager-for-removal}
SecurityManager类标记为Deprecate,将来某个时刻(JEP 398)就被拿走了,既然不常用那么还是移除掉吧,免得看着眼烦,蛮好的。
2.12 JEP 412: Foreign Function & Memory API (Incubator) {#212-jep-412-foreign-function--memory-api-incubator}
引入一个API,允许Java程序安全有效地访问Java堆之外的外部内存。连续在14,15,16,17种发布,Java的手越来越长,学无止境了。
2.13 JEP 414: Vector API (Second Incubator) {#213-jep-414-vector-api-second-incubator}
增强了向量计算的API Vector。
2.14 JEP 415: Context-Specific Deserialization Filters {#214-jep-415-context-specific-deserialization-filters}
在Java runTime 时为每一个反序列化操作配置上下文等 。
总结 {#总结}
Java17 是Java走过20多个年头后,由众多开发者不断的付出心血,细心研磨出来。众多的Java支持者为了Java走的更远付诸了不计其数的日夜。Java17删除弃用了一些不常用的功能,不断的迭代更新,以支持Java的跨平台性,同时也为了Java开发者能更好更方便的使用Java语言提供了许许多多的便利。首先作为Java开发人员,还是很感激那些在这些基础工作里面付出心血的大神们,随着Java不断的演变,必将Make The World Batter Place。
后记 {#后记}
Java17 再没有ZGC的一些增强,那么也能说明ZGC的成熟度已经不错,那么后面指北君也将为大家带来ZGC的相关文章。欢迎大家持续品尝!
本文介绍了Java17的一些特性,概述了指北君的一些理解,当然肯定会有很多理解错误的地方,希望大家积极指正,共同学习进步。 record,sealed 等关键字如此的丝滑舒适,后面会单独抽出来详细讲解一啦。另外Java17 的switch已经包罗万象了,那么指北君将会带来switch的万剑齐发篇等,敬请期待。
附录 {#附录}
OpenJDK 17 EA 版下载地址及相关内容 : https://download.java.net/java/early_access/jdk17/25/GPL/openjdk-17-ea+25_windows-x64_bin.zip
http://openjdk.java.net/projects/jdk/17/
http://jdk.java.net/17/
后记2 {#后记2}
指北君问你一句,Java17香不香。香的话请素质三连一下喽,如果不香的话,也请素质三连,接受更多的批评麽。
最后的最后,都到这里了,素质三连来一个也不差!毕竟后面的货也很干!