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/

(0)

相关推荐