Java 21 中的记录模式 - Sip of Java

记录模式在 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 中的面向数据编程”,以了解其将如何实现的愿景。

附加阅读

JEP 440 - 记录模式

JEP 395 - 记录

面向数据编程

JEP 443 - 未命名的模式和变量

祝您编码愉快!