3分钟带你品尝 新鲜出炉的Java 17,鲜嫩多汁,看完就知道香不香! --20210804

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年。

image-20210610004008638

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预览喽

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");
    }
}

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修饰的类和接口限制其他的类或者接口的扩展和实现。说白了就是限制类的继承或者接口的实现数量。

简单例子如下:

定义一个天体的接口

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 { ... }

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)

增强了向量计算的API Vector。

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/

后记2

指北君问你一句,Java17香不香。香的话请素质三连一下喽,如果不香的话,也请素质三连,接受更多的批评麽。

最后的最后,都到这里了,素质三连来一个也不差!毕竟后面的货也很干!

Java Geek Tech wechat
欢迎订阅 Java 技术指北,这里分享关于 Java 的一切。