一帆磨砺

生活所迫,一叶孤舟

0%

Java版本特性-JDK15

引用参考文档链接

  1. jdk15特性列表
  2. 隐藏类使用案例
  3. UDP通信:DatagramSocket类和DatagramPacket类
  4. Java17新特性初探

写在开头

  1. ZGC和Shenandoah 的可正式投产比较重要
  2. 隐藏类的使用场景不多,但是对于agent和平台框架开发人员来说比较重要
  3. 文本块的正式开放使用,喜大普奔,相较于以前的大文本操作用起来是真的舒服很多

新签名方案:EdDSA(爱德华兹曲线数字签名算法)

新增的签名方案,相比于现有的其他签名方案,它更快并且不降低安全性。可在TLS 1.3 中使用。

密封类(预调整)

使用sealed修饰类后,通过permits限制可以继承当前类的子类,避免无限制的继承扩张。
接口也是同样的使用规则。

1
2
3
4
public abstract sealed class Shape 
permits com.example.polar.Circle,
com.example.quad.Rectangle,
com.example.quad.simple.Square {...}

子类必须是 final 或者 sealed

隐藏类

官方文档看的比较晦涩,可以浏览隐藏类使用案例进行初步的了解,该特性对于平台、框架、agent开发人员比较友好,正常的业务场景不会使用到该特性。

删除Nashorn JavaScript 引擎

删除 Nashorn JavaScript 脚本引擎和 API 以及该jjs 工具。JDK11标注弃用,JDK15删除。

重新实现 DatagramSocket API

用易于维护和调试的更简单、更现代的实现替换java.net.DatagramSocket和API的底层实现。
笔者未使用过,因此通过其他博主分享的文章了解DatagramSocket是UDP通信的相关类。网络编程相关需要重点关注下。

弃用和禁用偏向锁

根据官方文档的说明

  1. 应用不会通过偏向锁获得明显的性能优化
  2. 偏向锁的维护成本较高,并且侵入了其他的HotSpot组件
    因此,官方决定禁用并且弃用偏向锁。
    实际的编码中,不会直接涉及偏向锁,主要是JVM内部实现涉及。

instanceof增强(第二次预调整)

This JEP proposes to re-preview the feature in JDK 15, with no changes relative to the preview in JDK 14, in order to gather additional feedback.

没变动,纯粹属于提个醒,想收集更多的反馈…..

ZGC可正式投产

默认仍是G1,通过启动参数-XX:+UnlockExperimentalVMOptions -XX:+UseZGC启用

文本块

无新增调整,正式开放使用。

Shenandoah 可正式投产

默认仍是G1,通过启动参数-XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC启用。
本次无新增功能,并且JDK8于JDK11同步可正式投产使用。

删除 Solaris 和 SPARC 端口

JDK14标记弃用,本次迭代彻底删除。

  • 删除所有特定于 Solaris 操作系统的源代码
  • 删除特定于 SPARC 体系结构的所有源代码

外部内存访问 API(更新调整)

本次更新内容:

  • 丰富的VarHandle组合器 API,用于自定义内存访问 var 句柄;
  • 通过接口有针对性地支持内存段的并行处理Spliterator;
  • 增强了对映射内存段的支持(例如,MappedMemorySegment::force);
  • 支持串行限制的安全 API 点(例如,在两个线程之间转移线程所有权);和
  • 不安全的 API 指向操作和取消引用来自例如本地调用的地址,或者将这些地址包装到合成内存段中

因为使用经验较少,对于更新内容无法作出总结…

新的数据建模方式 Records(第二次预调整)

  • 适配了sealed
    1
    2
    3
    4
    5
    6
    7
    8
    9
    package com.example.expression;

    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 {...}
  • 可局部数据建模
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    List<Merchant> findTopMerchants(List<Merchant> merchants, int month) {
    // Local record
    record MerchantSales(Merchant merchant, double sales) {}

    return merchants.stream()
    .map(merchant -> new MerchantSales(merchant, computeSales(merchant, month)))
    .sorted((m1, m2) -> Double.compare(m2.sales(), m1.sales()))
    .map(MerchantSales::merchant)
    .collect(toList());
    }

弃用 RMI(Remote Method Invocation) Activation

RMI 即 Remote Method Invocation ,其为 Java 提供了远程方法调用的能力,不过,比较鸡肋,基本不会用到。RMI Activation 为激活分布式对象提供支持,不过,一般也不会用到。

欢迎关注我的其它发布渠道