侧边栏壁纸
博主头像
ZHD的小窝博主等级

行动起来,活在当下

  • 累计撰写 79 篇文章
  • 累计创建 53 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

JDK 16 的新特性(简版)

江南的风
2021-07-15 / 0 评论 / 0 点赞 / 20 阅读 / 5031 字 / 正在检测是否收录...

Java 16 的新特性(简版)

JDK 16在2021年3月16日正式发布,虽然它不是长期支持(LTS)版本,但带来了许多新特性和改进。以下是JDK 16的主要新特性:

1. instanceof的模式匹配 (正式发布)

参考链接:https://openjdk.org/jeps/394

改进的instanceof在JDK 14和JDK 15中作为预览特性引入,最终在JDK 16中确定。它允许在instanceof检查的同时声明一个新的变量,并且这个变量的类型是被检查对象的类型(如果instanceof检查成功的话)。这个特性简化了代码,减少了类型转换的需要,并提高了代码的可读性。

例子:

public class InstanceOfPatternMatchingDemo {  
  
    public static void main(String[] args) {  
        Object obj = "Hello, World!";  
  
        // 使用传统的instanceof检查和类型转换  
        if (obj instanceof String) {  
            String str = (String) obj;  
            System.out.println(str.toUpperCase());  
        }  
  
        // 使用Java 16的instanceof模式匹配  
        if (obj instanceof String s) {  
            // s的类型已经被推断为String,无需再次转换  
            System.out.println(s.toUpperCase());  
        }  
  
        // 也可以用在更复杂的表达式中  
        Object obj2 = 123;  
        if (obj2 instanceof Integer i && i > 100) {  
            // i的类型已经被推断为Integer,并且可以直接使用  
            System.out.println("The number is: " + i);  
        }  
  
        // 嵌套类型检查  
        Object obj3 = new ArrayList<String>() {{  
            add("Apple");  
            add("Banana");  
        }};  
  
        if (obj3 instanceof List<?> list && !list.isEmpty()) {  
            // list的类型被推断为List<?>,可以直接使用  
            System.out.println("The list contains: " + list.get(0));  
        }  
    }   
}

2. 记录(Records)(正式发布)

参考链接:https://openjdk.org/jeps/395

记录(Records)它提供了一种简洁的方式来声明不可变的类,主要用于作为数据的透明载体。记录类自动实现了equalshashCodetoString方法,并且所有的字段都是final的,即不可变的。

例子:

// 定义一个名为Person的记录  
public record Person(String name, int age) {  
    // 你可以在这里添加方法,但通常记录是设计为不可变的,并且只包含数据  
  
    // 示例:添加一个方法计算年龄是否是成年人  
    public boolean isAdult() {  
        return age >= 18;  
    }  
  
    // 注意:你不能添加字段,因为记录的所有字段都是在声明时指定的  
    // 你也不能覆盖equals、hashCode或toString方法,因为记录已经为你做了这些  
  
    // 你可以有静态方法、静态字段等,但这不是记录的主要用途  
    public static void main(String[] args) {  
        // 创建Person记录的一个实例  
        Person alice = new Person("Alice", 30);  
  
        // 使用记录的自动生成的toString方法  
        System.out.println(alice); // 输出类似:Person[name=Alice, age=30]  
  
        // 访问记录的字段(通过编译器生成的访问器方法)  
        System.out.println("Name: " + alice.name()); // 注意这里使用name()来访问字段  
        System.out.println("Age: " + alice.age());  
  
        // 使用自定义方法  
        System.out.println("Is Alice an adult? " + alice.isAdult());  
  
        // 尝试修改记录的字段(这将导致编译错误,因为字段是final的)  
        // alice.name = "Bob"; // 编译错误  
  
        // 由于记录是不可变的,你不能改变其状态,但你可以创建新的记录实例  
        Person olderAlice = new Person(alice.name(), alice.age() + 1);  
        System.out.println(olderAlice); // 输出类似:Person[name=Alice, age=31]  
    }  
}

3. 其他更新

  • ZGC的并发线程堆栈处理(JEP 376)

  • Elastic Metaspace(JEP 387)

  • jpackage工具(JEP 392)

  • 外部链接程序API(JEP 389)

  • 外部存储器访问API(JEP 393)

0

评论区