概述
有的时候我们只需要一个很简单的类,像是常量一样,其成员变量在new过后基本不会改变,我们希望把这些成员变量定义为private final类型,这个时候就可以使用到在java 14中预览、java 16正式发布的 记录(record) 类,用于简化这种简单类的创建。
特性
我们以一个坐标类来说明 记录 这种特殊类的特点。
1.我们可以将坐标类简洁的定义为如下形式:
record Point(double x,double y) { }
2.该类中自动包含成员变量字段:
private final double x;
private final double y;
3.该类中自动包含一个构造方法:
Point(double x, double y) { ... }
4.该类中自动包含相关成员变量的get方法(省略了get字段):
public double x() { return x; }
public double y() { return y; }
注释:在java中,类的变量与方法具有相同的名字是合法的。
5.该类中自动包含3个自动定义的方法:toString、equals、hashCode。
可自定义部分
1.不能为记录添加额外的实例字段,如有需要,则不应使用记录类。
private double r; //error
2.可以定义静态字段和静态方法,这些方法属于类而不属于任何一个实例。
public static Point ORIGIN = new Point(0, 0);
public static double distance(Point p, Point q){
return Math.hypot(p.x-q.x, p.y-q.y);
}
3.在创建record类的标签时,可以加入可变类,但十分不推荐这样做,它违背了record类的初衷。
record PointInTime(double x, double y, Date when) { }
构造方法
包含:标准构造方法、自定义构造方法、标准构造方法的简洁重载。
1.标准构造方法即为自动生成的默认构造方法,不再赘述。
2.自定义构造方法:第一个语句必须是调用另一个构造器,虽然不必是标准构造器,但最终一定会调用标准构造器。
record Point(double x, double y){
public Point() {
this(0, 0);
}
}
3.你可以通过省略入参结构的方法,简洁的重载标准构造方法:
record Range(int from, int to){
public Range{
if (from > to){ int temp = from; from = to; to = temp; }
}
}
经验总结
1.记录类对所有标准字段自动定义为private final类型,且不允许自定义另外的实例字段。
2.可以自定义静态变量和静态方法。
3.实例字段可以定义可变类型,但不推荐这样做。
4.自定义构造方法时,要注意语法上的规定。