JDK 20 - 记录模式(Record Patterns Second Preview)

245 阅读2分钟

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的记录类型,它有两个字段:nameage。记录类型提供了默认的构造函数和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的记录类型,它有两个字段:xy。记录模式提供了一个构造函数,可以在创建对象时执行检查。在这个例子中,如果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版本中发生更改。

本文正在参加「金石计划」