3分钟带你品尝新鲜出炉的Java 17,看完就知道香不香!
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 的个人资料
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 都有些啥?
目前openjdk官网已经放出了JDK 17 的一些特性。下面我们将列出一些这些新特性,并做简短解释!
2.1 JEP 306: Restore Always-Strict Floating-Point Semantics
主要就是简化数学类库的开发,包括java.lang.Math
and java.lang.StrictMath
.
2.2 JEP 356: Enhanced Pseudo-Random Number Generators
增加伪随机数接口RandomGenerator,适应基于stream操作的程序。
2.3 JEP 382: New macOS Rendering Pipeline
给macOS提供一个渲染管道工具。苹果不用OpenGL了,那Java为了适应它也要慢慢的减少使用。
2.4 JEP 391: macOS/AArch64 Port
总结一句就是,Java 是一个跨平台的语言,那么不管什么样的系统架构,咱们都必须支持起来,苹果用户不少,咱得及时服务好。
2.5 JEP 398: Deprecate the Applet API for Removal
Applet类从小黑屋打入死牢,从Java9就进了小黑屋,看来很快就会和小黑屋的其他朋友们一起被移除了。终究是错付了青春!
2.6 JEP 403: Strongly Encapsulate JDK Internals
持续提高JDK的安全性可维护性,推荐开发者使用标准的Java API 而不使用Java的一些内部操作,可以更好的升级Java版本。看来要持续搞无缝衔接,Java想要流芳百世的说!
2.7 JEP 406: Pattern Matching for switch (Preview)
继Java16之后,又一次增强switch语句。此处概括就是,万物皆可switch。什么null,Exception,类类型皆不在话下。国外程序员都很喜欢使用switch麽,那下一期我们安排一个switch系列。唠一唠!
先给一点switch预览喽
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');
}
}
int eval(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
删除远程方法调用 (RMI) 激活机制, 移除 java.rmi.activation
包,能关小黑屋的都全部关进去。good bye!
2.9 JEP 409: Sealed Classes
Sealed 关键字在C#充当了类似于Java Final 关键字的作用。但Java拿到这个种子之后就开出了不一样的花,而且做的很Java。
sealed修饰的类和接口限制其他的类或者接口的扩展和实现。说白了就是限制类的继承或者接口的实现数量。
简单例子如下:
定义一个天体的接口
public sealed interface Celestial permits Planet,Star,Comet { }
那么对于接口Celestial的实现类就只能是permits 中的 Planet,Star,Comet 这三个,其他的实现类均为不允许。
final class Planet implements Celestial { }
final class Star implements Celestial { }
final class Comet implements Celestial { }
如果再有其他的类想要实现接口Celestial,那么编译器会提示sealed hierarchy不允许。
final class spaceShip implements Celestial { } //则会报错如下 //huispaceShip is not allowed in the sealed hierarchy
Idea 给出的提示就是把spaceShip加回到permits list 里面。
如果再配合Java16 推出的 record 关键字一起使用,那么碰撞出的火花,自然异常精彩!下面请看:
public sealed interface Expr
permits ConstantExpr, PlusExpr, TimesExpr, NegExpr { ... }
public record 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
移除AOT提前编译和JIT即时编译的功能,Oracle JDK16 未包含此功能。很多我们未用过的功能就默默的消失了,又为我们的学习减轻了不少负担!
2.11 JEP 410: Deprecate the Security Manager for Removal
SecurityManager类标记为Deprecate,将来某个时刻(JEP 398)就被拿走了,既然不常用那么还是移除掉吧,免得看着眼烦,蛮好的。
2.12 JEP 412: Foreign Function & Memory API (Incubator)
引入一个API,允许Java程序安全有效地访问Java堆之外的外部内存。连续在14,15,16,17种发布,Java的手越来越长,学无止境了。
2.13 JEP 414: Vector API (Second Incubator)
SecurityManager类标记为Deprecate,将来某个时刻(JEP 398)就被拿走了,既然不常用那么还是移除掉吧,免得看着眼烦,蛮好的。小黑屋里多了一个小伙伴。嘿嘿。
2.14 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/