• Java SE 15 新增特性


    Java SE 15 新增特性

    作者:Grey

    原文地址:

    博客园:Java SE 15 新增特性

    CSDN: Java SE 15 新增特性

    源码

    源仓库: Github:java_new_features

    ZGC

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

    这个 JEP 377 修复了一些错误,增加了一些功能和改进,现在支持 Linux/x86_64 、Linux/aarch64、Windows 和 macOS 等主要平台。
    这个JEP 377还将 ZGC 从一个实验性功能变为一个产品功能。然而,默认的垃圾收集器仍然是 G1。

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

    java -XX:+UseZGC className
    
    • 1

    文本块正式启用

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

    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

    示例代码如下

    package git.snippets.jdk15;
    
    /**
     * text block正式启用
     * @author Grey
     * @date 2021/11/29
     * @since 15
     */
    public class BlockTestInJava15 {
        public static void main(String[] args) {
            String content = """
                    {
                        "hello": 1,\
                        "world": 2,
                        "hello world": "1\s2",
                    }
                     """;
            System.out.println(content);
            String java15 = """
                    
                        
                            

    Hello, World

    """
    ; System.out.println(java15); } }
    • 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

    运行结果

    
    {
        "hello": 1,    "world": 2,
        "hello world": "1 2",
    }
    
    <html>
        <body>
            <p>Hello, Worldp>
        body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    Sealed Classes

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

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

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

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

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

    package git.snippets.jdk15;
    
    /**
     * @author Grey
     * @date 2022/8/21
     * @since 15
     */
    public abstract sealed class Person permits Employee, Manager {
    
        //...
    }
    final class Employee extends Person {
    }
    
    non-sealed class Manager extends Person {
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

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

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

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

    if (person instanceof Employee) {
        return ((Employee) person).getEmployeeId();
    } 
    else if (person instanceof Manager) {
        return ((Manager) person).getSupervisorId();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 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 之前

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

    在 Java SE 14 中,可以简化为

            // Java 14+
            if (obj instanceof H jd2) {
                jd2.setId(1);
            }
    
    • 1
    • 2
    • 3
    • 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

  • 相关阅读:
    AVS3帧间预测
    Linux命令(94)之tail
    基于PPT的三维光路结构示意图绘制实例演示-技术细节
    受了刺激,决定专升本
    Vue(四)——使用脚手架(1)
    Unity读书系列《Unity3D游戏开发》——脚本(一)
    判断对象是否可以被回收:引用计数法,可达性分析,finalize()判定
    优化系统报错提示信息,提高人机交互(一)
    互联网Java工程师面试题·Java 总结篇·第十弹
    RemObjects Elements多用途软件开发工具链
  • 原文地址:https://blog.csdn.net/hotonyhui/article/details/126452802