JDK17 与 JDK11 特性差异浅谈( 五 )

在 JDK16 之前的版本中,我们不能在类名后面直接写参数来定义类的状态 。这是 JDK16 引入 record 类的一个新特性 。
调用 Record 类方式 , 如下:
public class App {public static void main(String[] args) {User user = new User("user", "123456");System.out.println(user.username());}}注意事项:

  • record 类不允许使用 abstract 关键字定义为抽象
  • 所有成员变量均为 final 修饰,不允许再次赋值
  • 允许出现静态变量/实例方法/静态方法
  • 允许出现其他构造方法,但必须调用 record 构造方法
  • Record 不允许 extends 继承其他类
1.16 密封类在 JDK15 中,Java 提出了密封类( Sealed Classes )的概念,在 JDK17 中被正式确认 。密封类允许类和接口定义其允许的子类型 。因此 , 如果一个类没有显式地使用 sealed 、non-sealed 或 final 关键字,那么它的默认权限就是 non-sealed。
以下是一个密封类的代码示例:
sealed class Human permits Kyrie, LeBron, George {public void printName() {System.out.println("Default");}}non-sealed class Kyrie extends Human {public void printName() {System.out.println("Bob");}}sealed class LeBron extends Human {public void printName() {System.out.println("Mike");}}final class George extends Human {public void printName() {System.out.println("Yannick");}}在这个例子中,Human 是一个密封类,它只允许 Kyrie,LeBron 和 George 这三个类继承 。这样,我们就可以更精确地控制哪些类可以继承 Human 类,从而提高代码的安全性和可读性 。
1.17 统一日志异步刷新在 JDK17 中,引入了一项新特性:统一日志异步刷新 。
先将日志写入缓存,然后再异步地刷新到日志文件,这样写日志的操作就不会阻塞执行业务逻辑的线程 , 从而提高了程序的运行效率 。这个特性对于需要大量日志输出,并且对性能有较高要求的应用来说 , 是一个非常实用的改进 。可以通过传递命令行选项 -Xlog:async 来开启此功能 。
总结从 JDK11 到 JDK17 ,Java 的发展经历了一系列重要的里程碑 。其中最重要的是 JDK17 的发布,这是一个长期支持(LTS)版本,它将获得长期的更新和支持,有助于保持程序的稳定性和可靠性 。此外,Java 的性能也有了显著的提升 。这些进步都反映了 Java 在持续改进和适应现代编程需求方面的承诺 。
参考文档
  1. https://openjdk.org/projects/jdk/
  2. JDK12: JDK12新功能深度解析_jdk12新特性-CSDN博客
  3. switch statement - What does the new keyword "yield" mean in Java 13? - Stack Overflow
  4. New Features in Java 13 | Baeldung
  5. Java 11 and 12 - New Features (packtpub.com)
  6. Java 16 and IntelliJ IDEA | The IntelliJ IDEA Blog (jetbrains.com)
  7. Sealed Class in Java - GeeksforGeeks




推荐阅读