java.lang.Object
java.lang.Record
这是所有Java语言记录类的通用基类。
有关记录的更多信息,包括编译器合成的隐式声明方法的描述,可以在《Java语言规范》第8.10节中找到。
一个记录类是一个浅不可变的、透明的载体,用于存储一组固定的值,称为记录组件。Java语言提供了声明记录类的简洁语法,其中记录组件在记录头中声明。在记录头中声明的记录组件列表形成记录描述符。
记录类具有以下强制成员:一个规范构造函数,必须提供至少与记录类一样多的访问权限,并且其描述符与记录描述符相同;与每个组件对应的私有最终字段,其名称和类型与组件的名称和类型相同;与每个组件对应的公共访问器方法,其名称和返回类型与组件的名称和类型相同。如果在记录的主体中没有显式声明这些成员,那么将提供这些成员的隐式实现。
规范构造函数的隐式声明具有与记录类相同的可访问性,并从相应的构造函数参数初始化组件字段。访问器方法的隐式声明返回相应组件字段的值。从所有组件字段派生Object.equals(Object)
、Object.hashCode()
和Object.toString()
方法的隐式声明是从所有组件字段派生的。
为规范构造函数或访问器方法提供显式声明的主要原因是验证构造函数参数、对可变组件执行防御性拷贝,或者对组件组进行规范化(例如将有理数缩减为最低项)。
对于所有记录类,必须满足以下不变性:如果记录R的组件为c1, c2, ... cn
,那么如果将记录实例复制如下:
R copy = new R(r.c1(), r.c2(), ..., r.cn());那么必须满足
r.equals(copy)
。
- API注释:
-
实现了
Serializable
的记录类称为可序列化记录。可序列化记录的序列化和反序列化方式与普通可序列化对象不同。在反序列化期间,将调用记录的规范构造函数来构造记录对象。对于可序列化记录,将忽略某些与序列化相关的方法,如readObject和writeObject。有关可序列化记录的更多信息,请参阅《Java对象序列化规范》第1.13节“记录的序列化”。 - 参见Java语言规范:
-
8.10 记录类型
- 自JDK版本:
- 16
- 外部规范
-
Constructor Summary
-
Method Summary
-
Constructor Details
-
Record
protected Record()记录类调用的构造函数。
-
-
Method Details
-
equals
表示某个对象是否与此对象相等。除了Object.equals
的一般约定外,记录类还必须遵守以下不变性:当通过将记录组件访问器方法的结果传递给规范构造函数来“复制”记录实例时,如下所示:R copy = new R(r.c1(), r.c2(), ..., r.cn());
那么必须满足r.equals(copy)
。- 覆盖:
-
equals
在类Object
中 - 实现要求:
-
隐式提供的实现仅在参数是与此记录类相同的记录类的实例且此记录的每个组件等于参数的相应组件时返回
true
。否则,返回false
。组件c
的相等性如下确定:- 如果组件是引用类型,则仅当
Objects.equals(this.c, r.c)
返回true
时,组件才被视为相等。 - 如果组件是原始类型,则使用相应的原始包装类
PW
(int
的相应包装类是java.lang.Integer
,依此类推),仅当PW.compare(this.c, r.c)
返回0
时,组件才被视为相等。
- 如果组件是引用类型,则仅当
- 参数:
-
obj
- 用于比较的参考对象。 - 返回:
-
如果此记录等于参数,则返回
true
;否则返回false
。 - 参见:
-
hashCode
public abstract int hashCode()返回记录的哈希码值。遵守Object.hashCode
的一般约定。对于记录,哈希行为受到Record.equals
的精细化约定的限制,以便从相同组件创建的任何两个记录必须具有相同的哈希码。 -
toString
返回记录的字符串表示。根据Object.toString()
的一般约定,toString
方法返回一个“文本ually表示”此记录的字符串。结果应该是简洁但信息丰富的表示,易于人们阅读。除了这个一般约定外,记录类还必须进一步遵守以下不变性:任何两个相等的记录必须产生相等的字符串。在相应的相等组件值可能无法为自身产生相等字符串的罕见情况下,此不变性必须放宽。
-