首页 > 编程语言 >Java SE 15 新增特性

Java SE 15 新增特性

时间:2022-08-21 17:12:35浏览次数:78  
标签:instanceof JEP Java sealed 15 SE

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 垃圾收集器

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

示例代码如下

package git.snippets.jdk15;

/**
 * text block正式启用
 * @author <a href="mailto:[email protected]">Grey</a>
 * @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 = """
                <html>
                    <body>
                        <p>Hello, World</p>
                    </body>
                </html>
                """;
        System.out.println(java15);
    }
}

运行结果


{
    "hello": 1,    "world": 2,
    "hello world": "1 2",
}

<html>
    <body>
        <p>Hello, World</p>
    </body>
</html>

Sealed Classes

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

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

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

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

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

package git.snippets.jdk15;

/**
 * @author <a href="mailto:[email protected]">Grey</a>
 * @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 {
}

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

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

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

if (person instanceof Employee) {
    return ((Employee) person).getEmployeeId();
} 
else if (person instanceof Manager) {
    return ((Manager) person).getSupervisorId();
}

如果没有一个密封的类,编译器就不能合理地确定所有可能的子类都被我们的 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);
        }

在 Java SE 14 中,可以简化为

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

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

标签:instanceof,JEP,Java,sealed,15,SE
From: https://www.cnblogs.com/greyzeng/p/16610328.html

相关文章

  • 实习记录 base
    好久没有在这里写文章了,在这边很少发文章,互动也比较少,没什么人关注,那就肆意地记录一点实习的插曲吧。曾经梦想的生活是这样的:在公司里,倒杯咖啡或是其他喜欢的饮品......
  • selenium
    相信你在网上一搜有大把的资料可以查看参考,不乏大佬们的专业讲解,都有很高的参考价值,不过我还是推荐你先看一下官方说明,毕竟这是官方的一手教材:https://www.selenium.dev/do......
  • IDEA打包普通java项目并用java命令运行
    IDEA下打包为jar包,普通java项目(非web项目)效果是将第三方jar包放到一个文件夹中(如lib),这样看起来清晰一些。如下图这种:  1.项目结构。   1.关键:modules  ......
  • 关于Java 连接 MySQL 数据库报错:Failed to obtain JDBC Connection; ...: Communicati
    原因:是因为Java连接MySQL没有收到任何数据包,也就是说连接失败。解决方法:打开Windows服务程序,找到mysql进程,重启一下就可以了。......
  • 解决DOS系统运行JAVA程序乱码问题
    使用DOS程序运行java程序的时候,碰到乱码问题多数情况是:DOS支持GBK简体中文,不支持UTF-8,只要设置成UTF-8就可以啦。正确显示UTF-8字符,可以按照以下步骤操作:1、打开CMD.exe......
  • 【SQLServer】执行SQL查询报错The semaphore timeout period has expired
    通过Microsoft SQLServer Management Studio执行sql查询的时候报错:Atransport-levelerrorhasoccurredwhenreceivingresultsfromtheserver.(provider:TCP......
  • svn客户端检出的工程导入eclipse后不显示SVN信息
    1、首先确定原因:是由于SVN客户端与SVN插件版本不对应导致的,因此需要更换SVN插件版本1.1、SVN插件与SVN客户端版本对应关系插件svn1.4.x对应TortoiseSvn1.5.x插件svn1.6......
  • 封面 - JavaScript指南
     IT软件开发之JavaScript   AGuidetoJavaScriptJavaScript指南-------------------------------------------------------------------------------争取做......
  • curl: (52) Empty reply from server解决方法
    https://www.itbiancheng.com/article/5030.html 今天朋友说服务器上面定时发布的文章,没有正常的发出去由此想到了是不是定时任务出了问题,手动执行的时候提示curl:(5......
  • SqlServer 查看索引使用情况
    索引可以提供数据的快速访问,它能快速的定位到具体的数据行,返回sql查询语句的结果。通过一下sqlserver动态管理视图,可以查看索引的使用情况:select DB_NAME(ddius.data......