之前我们使用 class
关键字来定义类,但从 Java 16
开始,我们也可以利用 record
关键字来定义类。record
关键字提供了一种更为简洁、紧凑的 final
类定义方式。下面介绍 record
类的一些使用细节。
record
概念:Java 16
引入的一种特殊形式类,其状态不可变,而且公共可读。
一、record类声明
在 Java 16
之前,我们定义一个 Point
类,用于描述平面上的一个点时(有x
和y
坐标),通常会这样定义类:
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 getX() {return x;}public double getY() {return y;}
}
在 Java 16
之后,我们可以利用 record类
这一新特性简化上面的代码。通过 record
关键字定义和声明 Point
类:
record Point(double x, double y) {}
Point p = new Point(1.0, 2.0);
System.out.println(p.x() + " " + p.y());
使用 record
关键字定义和声明 Point
类后,Java
会自动创建两个实例字段:private final double x;
和 private final double y;
。此外,record
还提供了访问器方法 x()
和 y()
用于访问这些字段。需要注意的是,这里并不是使用传统的 getX()
和 getY()
方法,而是直接使用 x()
和 y()
方法来获取属性值。
二、record类特点
利用 record
关键字声明类主要是为了简化声明过程,record
类本质是一类特殊的 class
,其具备以下这些特点:
record
类是final
类record
类自动实现访问器、toString
、equals
和hashCode
方法- 成员变量均为
public
属性
record Point(double x, double y) {}
Point p1 = new Point(1.0, 2.0);
System.out.println(p1.x() + " " + p1.y());
System.out.println(p1);Point p2 = new Point(1.0, 2.0);
Point p3 = new Point(3.0, 4.0);
System.out.println(p1.equals(p2)); // true
System.out.println(p1.equals(p3)); // false
System.out.println(p1.hashCode() + " " + p2.hashCode() + " " + p3.hashCode());
三、定义成员函数
由于 record
声明本质也是声明类,因此可以定义成员方法,比如在 Point
类中定义和使用计算当前平面点到原点(x=0,y=0)距离的方法:
record Point(double x, double y) {public double distanceToOrigin() {return Math.sqrt(x * x + y * y);}
}
Point p = new Point(1.0, 2.0);
System.out.println(p.distanceToOrigin());