Java 新特性-档案类

档案类特性在 JDK16 中正式发布,它是用来表示不可变数据的透明载体。档案类的关键字是 record,它内置了构造方法、hashCode 方法、equals 方法、toString 方法和不可变数据的读取方法等方法的缺省实现。

下面是一个档案类的 demo,它用来表示圆:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
* 记录一个圆的信息
*
* @param radius 半径
*/
public record Circle(double radius) {

public Circle {
if (radius <= 0) {
throw new IllegalArgumentException("圆的半径必须大于0");
}

}

/**
* 计算圆的面积
*
* @return 面积
*/
public double area() {
return Math.PI * radius * radius;
}

}

对 Circle 类的调用示例代码:

1
2
3
4
5
6
@Test
public void testCircle() {
Circle circle = new Circle(10);
System.out.println("圆的半径:" + circle.radius());
System.out.println("圆的面积:" + circle.area());
}

Java 档案类“不可变的数据”主要体现在以下几点:

  • Java 档案类不支持扩展子句,用户不能定制它的父类。隐含的,它的父类是 java.lang.Record。父类不能定制,也就意味着我们不能通过修改父类来影响 Java 档案的行为。
  • Java 档案类是个终极(final)类,不支持子类,也不能是抽象类。没有子类,也就意味着我们不能通过修改子类来改变 Java 档案的行为。
  • Java 档案类声明的变量是不可变的变量。这就是我们前面反复强调的,一旦实例化就不能再修改的关键所在。
  • Java 档案类不能声明可变的变量,也不能支持实例初始化的方法。这就保证了,我们只能使用档案类形式的构造方法,避免额外的初始化对可变性的影响。
  • Java 档案类不能声明本地(native)方法。如果允许了本地方法,也就意味着打开了修改不可变变量的后门。

通常我们把 Java 档案类看成是一种特殊形式的 Java 类。除了上述的限制,Java 档案类和普通类的用法是一样的。

Java 档案类“透明载体”是指档案类承载有缺省实现的方法,这些方法可以直接使用,也可以替换掉。


Java 新特性-档案类
https://blog.yohlj.cn/posts/d7c67c03/
作者
Enoch
发布于
2022年12月25日
许可协议