Java 21 中的记录模式 - Sip of Java
Billy Korando 于 2023 年 11 月 6 日
记录模式在 Java 21 中添加,提供了一种更轻松的方式来从 record
中提取数据。让我们来看看吧!
记录回顾
记录在 Java 16 中通过 JEP 395 添加。记录可以在一行中声明,例如以下示例
record Person(String fName, String lName, int age){}
虽然开发人员会注意到样板代码减少了,但记录的真正意图是以透明的方式定义数据作为数据。这是通过对记录施加一些约束来实现的,包括
- 所有字段都是
final
- 记录类隐式地是
final
- 禁止声明实例字段
此外,记录还提供了一些功能
- 所有记录类都包含规范构造函数
- 所有记录类都包含对组件的访问器
这些约束和功能使记录成为添加解构器的理想候选者。
解构器
解构器顾名思义,是构造函数的逆运算。构造函数用于创建和将数据添加到对象,而解构器用于从对象中提取数据,例如以下示例
record Name(String fName, String lName, int age) {};
Name host = new Name("William","Korando", 37);
if(host instanceof Name(String fName, String lName, int age)) {
String printName = lName + ", " + fName + " age: " + age;
}
组件匹配
记录模式很灵活。模式变量的类型只需要与 record
的组件兼容。在以下示例中,使用 var
代替
record Name(String fName, String lName, int age) {};
Name host = new Name("William","Korando", 37);
if(host instanceof Name(var first, var last, var a)) {
String printName = last + ", " + first + " " + a;
}
这里要注意,模式变量名也与 record
组件的名称不同。这有助于使记录模式更灵活,并避免潜在的变量名冲突。
嵌套模式
记录模式也可以嵌套,允许轻松地解构复杂记录
record Name(String fName, String lName, int age) {};
record Address(...) {};
record Person(Name name, Address address) {};
Name host = new Name("William","Michael", 37);
Address address = new Address(...);
Person person = new Person(host, address);
if(person instanceof Person(
Name(var first, var last, var middle), Address(...))) {
String printName = last + ", " + first + " age: " + age;
}
记录模式在 switch 中
您可以在 switch
中使用记录模式,现在 Java 21 支持模式匹配。
record Name(String fName, String lName, String mName) {};
Name host = new Name("William", "Michael", "Korando");
String printName = switch(person){
case Name(var fName, var lName, var mName) -> lName + ", " + fName + " " + mName;
};
面向数据编程
记录和记录模式是 Java 新兴的面向数据编程故事中的一个重要元素。这个故事将继续添加,例如,JEP 443,它引入了未命名的命名模式和变量,作为 Java 21 中的预览功能。请务必查看附加阅读部分以了解 Brian Goetz 的文章“Java 中的面向数据编程”,以了解其将如何实现的愿景。
附加阅读
祝您编码愉快!