在JDK16中引入了一个特殊的类,Record(记录);其状态不可变,而且公共可读。
创建一个Record:
public record Point(double x, double y) {
}
这个Point的实例字段被称为组件(component)
并且会为这个类提供一个构造器:
Point(double x, double y)
以及组件的访问器方法:
public double x()
public double y()
public class RecordClass {
public static void main(String[] args) {
var point = new Point(1.1,1.2);
var x = point.x();
var y = point.y();
System.out.println("x:" + x + "\ny:" + y);
}
}
x:1.1
y:1.2
Process finished with exit code 0
此外,每个记录还有3个自动定义的方法:toString、equals、hashCode
可以给记录增加自己的方法以及静态字段,但是不能添加实例字段!
记录的实例字段(这里说的实例字段指组件)会自动为final字段,不过,它们可能是可变对象的引用。
比如字段中添加一个Date when,这样记录实例将是可变的。
如果希望记录实例是不可变的,那么字段就不能使用可变的类型;
对于完全由一组变量表示的不可变数据,要使用记录而不是类;如果数据是可变的,或者数据表示可能随时间改变,则使用类。
另外,记录的标准构造器如果需要自定义,可以采用简洁的方式
public record Point(double x, double y) {
// 标准构造器的简洁自定义方式
public Point{
if (true) {
// 自定义代码
}
}
}