Java SE 15 新增特性

作者:Grey

原文地址:Java SE 15 新增特性

源码

源仓库: Github:java_new_features

镜像仓库: GitCode:java_new_features

ZGC

Java SE 11 JEP 333将 ZGC 垃圾收集器作为一项实验性功能引入。

这个 JEP 377 修复了一些错误,增加了一些功能和改进,现在支持 Linux/x86_64 、Linux/aarch64、Windows 和 macOS 等主要平台。

这个JEP 377还将 ZGC 从一个实验性功能变为一个产品功能。然而,默认的垃圾收集器仍然是 G1。

下面的命令启用了 ZGC 垃圾收集器

  1. java -XX:+UseZGC className

文本块正式启用

多行字符串或文本块经历了

Java 12 JEP 326 Raw String Literals

Java 13 JEP 355: Text Blocks (Preview)

Java 14 JEP 368: Text Blocks (Second Preview)

是 Java SE 15 中的一个正式启用的功能,见JEP 378: Text Blocks

示例代码如下

  1. package git.snippets.jdk15;
  2. /**
  3. * text block正式启用
  4. * @author <a href="mailto:410486047@qq.com">Grey</a>
  5. * @date 2021/11/29
  6. * @since 15
  7. */
  8. public class BlockTestInJava15 {
  9. public static void main(String[] args) {
  10. String content = """
  11. {
  12. "hello": 1,\
  13. "world": 2,
  14. "hello world": "1\s2",
  15. }
  16. """;
  17. System.out.println(content);
  18. String java15 = """
  19. <html>
  20. <body>
  21. <p>Hello, World</p>
  22. </body>
  23. </html>
  24. """;
  25. System.out.println(java15);
  26. }
  27. }

运行结果


  1. {
  2. "hello": 1, "world": 2,
  3. "hello world": "1 2",
  4. }
  5. <html>
  6. <body>
  7. <p>Hello, World</p>
  8. </body>
  9. </html>

Sealed Classes

目前,Java 没有提供对继承的细粒度控制。访问修饰符,如publicprotectedprivate,以及默认的package-private,提供了非常粗略的控制。

Sealed Classes 的目标是允许单个类声明哪些类型可以作为子类型使用。这也适用于接口和确定哪些类型可以实现它们, 其中

sealed -- 意味着它们必须使用 permits 关键字定义哪些类允许继承自它。

non-sealed -- 允许任何类能够继承于它。

密封类涉及两个新的关键字 -- sealed 和 permits,如下示例

  1. package git.snippets.jdk15;
  2. /**
  3. * @author <a href="mailto:410486047@qq.com">Grey</a>
  4. * @date 2022/8/21
  5. * @since 15
  6. */
  7. public abstract sealed class Person permits Employee, Manager {
  8. //...
  9. }
  10. final class Employee extends Person {
  11. }
  12. non-sealed class Manager extends Person {
  13. }

我们已经声明了一个名为 Person 的抽象类。我们还规定,能够扩展它的类只有 Employee 和 Manager。

任何继承密封类的类本身必须被声明为finalnon-sealed的或sealed的。这可以确保类的层次结构保持在有限的范围内被编译器识别。

这种有限的、详尽的层次结构是使用密封类的一大好处。让我们看看这个例子的实际应用。如下代码

  1. if (person instanceof Employee) {
  2. return ((Employee) person).getEmployeeId();
  3. }
  4. else if (person instanceof Manager) {
  5. return ((Manager) person).getSupervisorId();
  6. }

如果没有一个密封的类,编译器就不能合理地确定所有可能的子类都被我们的 if-else 语句所覆盖。如果末尾没有 else 子句,编译器可能会发出警告,表明我们的逻辑没有涵盖所有的情况。

Sealed Classes 在 Java SE 15 中是预览功能,到 Java SE 17 中正式启用。

创建隐藏类

Java SE 15中引入的一个新特性被称为隐藏类。虽然大多数开发者不会发现它们的直接好处,但任何使用动态字节码或 JVM 语言的人都可能会发现它们很有用。

隐藏类的目标是允许在运行时创建不能被发现的类。这意味着它们不能被其他类链接,也不能通过反射被发现。像这样的类通常有一个很短的生命周期,因此,隐藏类被设计成在加载和卸载时都很高效。

请注意,当前版本的 Java 确实允许创建类似于隐藏类的匿名类。然而,它们依赖于不安全的API。隐藏类则没有这种依赖性。

详见:JEP 371: Hidden Classes

instanceof 类型匹配 (二次预览)

instanceof 类型匹配功能在 Java SE 14 中进行了预览,Java SE 15 旨在继续其预览状态,没有新的增强功能。

该功能的目标是删除大量通常由 instanceof 操作符带来的模板代码。

在 Java SE 14 之前

  1. // Before Java 14:
  2. if (obj instanceof H) {
  3. H jd1 = (H) obj;
  4. jd1.setId(1);
  5. }

在 Java SE 14 中,可以简化为

  1. // Java 14+
  2. if (obj instanceof H jd2) {
  3. jd2.setId(1);
  4. }

Records(二次预览)

Records 是存储纯数据的数据类。使用 Records 是为了快速创建简单而简洁的类(不含模板代码)。

Records 最初在 Java SE 14 中作为早期预览版推出,Java SE 15 旨在继续其预览状态,在 Java SE 16 中正式发布。

移除 Nashorn JavaScript 引擎

Nashorn JavaScript 引擎在 Java 8 中被引入,在 Java 11 中被标记为废弃。由于 ECMAScript 语言发展很快,维护 Nashorn JavaScript 的成本过于高昂,在 Java 15 中被彻底删除。

详见:JEP 372: Remove the Nashorn JavaScript Engine

更多

Java SE 7及以后各版本新增特性

参考资料

JDK 15 Release Notes

Java 新特性教程

What’s New in Java 15

What is new in Java 15

Java SE 15 新增特性的更多相关文章

  1. Java SE 13 新增特性

    Java SE 13 新增特性 作者:Grey 原文地址:Java SE 13 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  2. Java SE 14 新增特性

    Java SE 14 新增特性 作者:Grey 原文地址:Java SE 14 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  3. Java SE 16 新增特性

    Java SE 16 新增特性 作者:Grey 原文地址:Java SE 16 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  4. Java SE 17 新增特性

    Java SE 17 新增特性 作者:Grey 原文地址:Java SE 17 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  5. Java SE 8 新增特性

    Java SE 8 新增特性 作者:Grey 原文地址: Java SE 8 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new_ ...

  6. Java SE 9 新增特性

    Java SE 9 新增特性 作者:Grey 原文地址: Java SE 9 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new_ ...

  7. Java SE 10 新增特性

    Java SE 10 新增特性 作者:Grey 原文地址:Java SE 10 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  8. Java SE 11 新增特性

    Java SE 11 新增特性 作者:Grey 原文地址:Java SE 11 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  9. Java SE 12 新增特性

    Java SE 12 新增特性 作者:Grey 原文地址:Java SE 12 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

随机推荐

  1. MVC - forward 和 redirect 的区别

    MVC - forward 和 redirect 的区别 forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服 ...

  2. BI 如何让SaaS产品具有 “安全感”和“敏锐感”(上)

    SaaS模式一经推出,凭借自身的高性价比.低维护成本,无需软硬件维护.无需运维等明晃晃的优点,得到了爆发式的增长,甚至全面改变了软件的开发模式.各位老总的问候语,不知从什么时候开始,都变成了:&quo ...

  3. 接口测试postman深度挖掘应用②

    上一篇文章我们已经介绍了postman的基本用法,以及接口测试原理.未关注博主的可以关注下博主,后期测试安全,以及各种工具用法,编程语言都会有讲解的 老样子:①先补习基础知识:  ②补充上一章节由于过 ...

  4. 论文解读(MGAE)《MGAE: Masked Autoencoders for Self-Supervised Learning on Graphs》

    论文信息 论文标题:MGAE: Masked Autoencoders for Self-Supervised Learning on Graphs论文作者:Qiaoyu Tan, Ninghao L ...

  5. SAP APO-PP / DS

    在SAP APO中,使用生产计划/详细计划(Production Planning/Detailed Scheduling)生成满足生产要求的采购建议. 此组件还用于定义资源计划和订单明细. 您还可以 ...

  6. MySql字段增删改语句

    新增表字段:alter table 表名 需要添加的字段信息; ALTER TABLE nation add seq VARCHAR(20) COMMENT '顺序' 字段名的修改:alter tab ...

  7. 正在运行中的docker容器设置自动重启

    # demo : 你的容器名称 docker update –-restart=always demo

  8. Tomcat 安装及配置,创建动态的web工程

    Tomcat可以认为是对Servlet标准的实现,是一个具体的Servlet容器. 1)        将Tomcat的安装包解压到磁盘的任意位(非中文无空格) 2)        Tomcat服务的 ...

  9. 选择结构-穿透的switch语句和循环结构-循环概述

     case的穿透性 在switch语句中,如果case的后面不写break,将出现穿透现象,也就是不会在判断下一个case的值,直接向后运 行,直到遇到break,或者整体switch结束 publi ...

  10. 牛客SQL刷题第一趴——非技术入门基础篇

    user_profile表: id device_id gender age university province 1 2138 male 21 北京大学 Beijing 2 3214 male   ...