Java记录
Java记录是一种特殊的Java类,它具有用于定义不可变的仅数据类的简洁语法。 Java Record实例对于保存从数据库查询返回的记录,从远程服务调用返回的记录,从CSV文件读取的记录或者类似类型的用例非常有用。
Java记录由一个或者多个数据字段组成,这些数据字段与常规Java类中的成员变量相对应。 Java编译器自动为这些数据字段生成getter方法,toString(),hashcode()和equals()方法,因此我们不必自己编写样板代码。由于Java记录是不可变的,因此不会生成任何setter方法。
Java记录类型是Java 14中的预览函数,因此我们还不知道记录是否会长期保留在Java中。,看看想法。由于Java Records是Java 14中的预览函数,因此我们需要启用预览函数才能使用它们(进行在线搜索以了解操作方法)。
Java记录语法
Java Record语法非常简单。这是一个对车辆进行建模的Java记录示例:
public record Vehicle(String brand, String licensePlate) {}
注意该示例如何使用" record"而不是" class"。 " record"关键字告诉Java编译器此类型定义是一条记录。
还请注意示例中定义的记录如何没有显式的Java字段定义。该记录仅由看起来像常规Java构造函数的东西定义。该构造函数实际上足以定义Java Record。在Record构造函数中定义的两个参数告诉Java编译器,记录类型具有两个字段,在构造函数中每个参数一个字段。然后,Java编译器会生成相应的字段,getter方法以及hashCode()和equals()方法。
使用Java记录
通过使用Javanew
关键字创建记录类型的实例,可以像使用其他Java类一样使用Java Record。这是使用上一节中定义的Java记录类型Vehicle的示例:
public class RecordsExample { public static void main(String[] args) { Vehicle vehicle = new Vehicle("Mercedes", "UX 1238 A95"); System.out.println( vehicle.brand() ); System.out.println( vehicle.licensePlate() ); System.out.println( vehicle.toString() ); } }
请注意,Java编译器如何为我们生成了一个brand方法,licensePlate方法和toString方法。上面示例输出的输出为:
Mercedes UX 1238 A95 Vehicle[brand=Mercedes, licensePlate=UX 1238 A95]
记录是最终的
记录类型定义是final,这意味着我们无法创建Java记录类型的子类(子记录)。
多个构造函数
Java Record类型定义可能包含多个构造函数。这是一个Java Record示例,它为该Java Record教程前面显示的Vehicle记录类型定义了一个额外的构造函数:
public record Vehicle(String brand, String licensePlate) { public Vehicle(String brand) { this(brand, null); } }
额外的构造函数在"车辆记录"声明的主体内声明。注意额外的构造函数如何调用Vehicle Record的默认构造函数。 Java编译器需要这样做,因此编译器知道额外构造函数中的哪些构造函数参数与默认构造函数中的哪些参数匹配。
我们可以根据具体的Java Record定义添加尽可能多的额外构造函数。
实例方法
我们可以将实例方法添加到Java Record定义中,就像使用常规Java类一样。这是前面几节中的Vehicle Java Record定义的示例,并添加了一个名为brandAsLowerCase()的实例方法:
public record Vehicle(String brand, String licensePlate) { public String brandAsLowerCase() { return brand().toLowerCase(); } }
注意,brandAsLowerCase()方法是如何在内部调用自动生成的brand()方法的。
静态方法
也可以将静态方法添加到Java Record定义中。这是以前的Vehicle Java Record定义的示例,其中添加了静态方法:
public record Vehicle(String brand, String licensePlate) { public static String brandAsUpperCase(Vehicle vehicle) { return vehicle.brand.toUpperCase(); } }