Record概念
记录是一种特殊的类,当你只想用一个类来记录某些不可变数据(比如一个点的坐标或者圆的半径和位置),就可以使用这种特殊的类。(JDK16及以上版本才有record)
Record声明
public record Point(double x,double y) { }
以上可以声明一个record,Point是record的名字,声明这个record相当于创建了以下这个类
public class Point {
private final double x;
private final double y;
public Point(double x,double y){this.x = x;this.y = y;}
public double y(){return y;}
public double x(){return x;}
//在此省略toString,equals,hashCode方法
}
java会为这个类自动创建实例字段以及每个字段的访问器和一个构造器,这里注意访问器的名字不是getX(),而是x()。这样子做可以防止一个record里面既有X又有x变量而无法区分它们的访问器。需要注意的是,java同样会为record生成toString,equals,hashCode方法。所有自动生成的方法都可以重写(包括构造器)。
在Record中定义自己的方法和字段
首先要说明的是record当中不允许自己增加实例字段
public record Point(double x,double y) {
private double a;//不允许这样做
}
但是可以增加方法,例如
public record Point(double x,double y) {
public double functionExample(){
return x*x;
}
}
也可以增加静态字段和方法
public record Point(double x,double y) {
public double functionExample(){
return x*x;
}
private static final double r = 0;
public static double getR(){return r;}
}
Record的构造器
除了record自动生成的构造器(标准构造器)之外,我们还可以自己定义自定义构造器,但是在自定义的构造器里必须调用标准构造器。如下,无参数的自定义构造器会调用标准构造器,并传入参数0,0。
public record Point(double x,double y) {
public Point(){
this(0,0);
}
}
最后
需要注意的是,record的实例字段自动为final(它们也有可能是可变对象的引用,如果是这样,它将可以通过对象的方法进行改变),所以只有当我们要存储一系列不可变数据的时候才应该使用record。如果我们要储存的数据要经常更改,则应该使用类。