JDK 14中引入了JEP 359
:Record类型。JDK 16中的JEP 395
在此基础上添加了记录类型的序列化支持。JDK 16还通过JEP 394
引入了模式匹配,以简化在Java中进行模式匹配的过程。JDK 17中的JEP 409
进一步扩展了模式匹配的功能。现在,JDK 20中的JEP 432
为Java添加了记录模式。记录模式可以在不需要编写大量样板代码的情况下定义记录类型,从而更容易地编写Java代码。
记录类型的定义
在JDK 14中,记录类型的定义如下:
public record Person(String name, int age) {}
这定义了一个名为Person的记录类型,它有两个字段:name
和 age
。记录类型提供了默认的构造函数和equals()
、hashCode()
和toString()
方法。
在JDK 20中,记录模式的定义如下:
public record Point(int x, int y) {
public Point {
if (x < 0 || y < 0) {
throw new IllegalArgumentException("Invalid coordinates");
}
}
}
这定义了一个名为Point的记录类型,它有两个字段:x
和y
。记录模式提供了一个构造函数,可以在创建对象时执行检查。在这个例子中,如果x或y的值小于零,将抛出一个IllegalArgumentException
异常。
记录模式的使用
- 创建记录对象
使用记录模式创建记录对象的语法与使用记录类型相同:
Point p = new Point(10, 20);
- 访问记录对象的字段
使用记录模式创建的记录对象的字段可以像普通Java对象一样访问:
int x = p.x();
int y = p.y();
- 比较记录对象
使用记录模式创建的记录对象可以像普通Java对象一样进行相等性比较:
Point p1 = new Point(10, 20);
Point p2 = new Point(10, 20);
boolean equals = p1.equals(p2); // true
- 记录模式的模式匹配
记录模式可以像记录类型一样使用模式匹配。例如:
public static void printInfo(Point p) {
if (p instanceof Point point) {
System.out.printf("Point (%d, %d)\n", point.x(), point.y());
} else {
System.out.println("Not a Point");
}
}
这个方法将打印出给定的对象是否是一个Point,以及Point对象的x和y值。
注意事项
在JDK 20中,记录模式为Java添加了一个更加方便的记录类型定义方式。使用记录模式可以更轻松地定义记录类型,并在创建对象时执行检查。记录模式还提供了模式匹配的支持,可以方便地进行类型判断。需要注意的是,记录模式仍处于预览阶段,并且可能会在未来的Java版本中发生更改。
本文正在参加「金石计划」