1. 概述

在这个教程中,我们将了解Java中的记录类(Record)和最终类(Final Class)之间的区别。

2. 记录类是什么?

记录类是一种特殊的类,作为不可变数据的透明载体。它们是不可变类(所有字段都是final),并且隐式地是不可扩展的类。

编写记录类时,我们需要记住一些限制:

  • 由于每个记录类默认继承抽象类Record,Java不支持多重继承,因此我们不能在声明中添加extends子句。
  • 记录类中不能声明实例变量或实例初始化器。
  • 我们也不能在记录类中声明原生方法。

一个记录类的声明包括名称、类型参数(如果记录是泛型的)、包含记录组件的头和主体:

public record Citizen (String name, String address) {}

Java编译器会自动生成私有、最终字段、getter、公共构造函数以及equalshashCodetoString方法。

此外,我们还可以在记录主体中添加实例方法,以及静态字段和方法:

public record USCitizen(String firstName, String lastName, String address) {
    static int countryCode;

    // static initializer
    static {
        countryCode = 1;
    }

    public static int getCountryCode() {
        return countryCode;
    }

    public String getFullName() {
        return firstName + " " + lastName;
    }
}

上述记录包含一个静态字段、一个静态方法和一个实例方法。

3. 最终类是什么?

最终类不能被扩展。它们使用final关键字声明:

final class Rectangle {
    private double length;
    private double width;

    // Rest of the body
}

由于它是最终类,我们无法创建另一个类来扩展Rectangle类。

4. 区别在哪里?

记录类本身也是最终类。然而,与常规最终类相比,记录类有更多约束。另一方面,在某些情况下,记录类使用起来更为方便,因为它们可以在一行内声明,并且编译器会自动生成其他内容。如果我们需要一个简单的不可变数据载体,且不需要从其他类继承,那么可以使用记录类。

5. 总结

在这篇短文中,我们了解了Java中记录类和最终类的区别。

如往常一样,本文使用的代码示例可在GitHub上找到。