final Class 和 Record 有什么区别?
What is the difference between a final Class and a Record?
简单来说,final class 和 Java 中的 record 有什么区别 17 ?
什么情况下应该使用记录?
Record 是一个 不可变的 class,即它的所有字段都是final
。 记录隐含final
,因此和常规最终class record
一样不能扩展.
对记录 (for more details, take a look at JEP 395) 施加了一些 限制。
与正常相反classes:
- 禁止在记录中声明实例字段显式(并提醒:所有字段都是
final
,这是一个非常无能的区别);
extends
子句不允许与 records 一起使用,因为每个 record 隐式 扩展 摘要classRecord;
- record 不能使用以下任何修饰符声明:
abstract
、sealed
或 non-sealed
(由于隐含 final
);
- 记录 无法声明实例初始值设定项 和本机方法.
记录是 “不可变数据的透明载体” 作为 JEP 395说。
它们被设计成简洁、默认构造函数、getters、hashCode/equals
和 toString()
将由编译器为您生成。因此,在 record 中,您只需声明自定义逻辑(if any),记录声明可以是 one-liner.
记录 与常规 最终 classes.
有很大不同
另外,除了上面提到的特性之外,序列化/反序列化的机制被重新实现为条记录,所以反序列化不绕过构造函数。
In which case should I use a record?
简而言之,如果你的对象必须有状态,或者你需要扩展一个特定的class,那么在这种情况下你不能使用record
。
另一方面,如果您的对象只是携带数据,则它们不打算被修改或继承自其他 classes,那么它可能是作为 record
.
实现的一个很好的候选者
A final
class 简直就是无法扩展的。但这对 class 没有其他限制;它仍然可以有可变字段,完全封装它的状态等。
A record
是给定状态组件元组的透明载体,需要公开从其状态描述派生的 API。因此,记录受到更严格的约束,但作为这些约束的交换,您可以获得大量便利(构造函数、访问器、Object
方法)以及一些语义承诺(例如,使用其组件访问器解包记录并用构造函数重新打包结果给你一个 equals
对象。)
记录也恰好是final
class,但这只是记录的一小部分。
简单来说,final class 和 Java 中的 record 有什么区别 17 ?
什么情况下应该使用记录?
Record 是一个 不可变的 class,即它的所有字段都是final
。 记录隐含final
,因此和常规最终class record
一样不能扩展.
对记录 (for more details, take a look at JEP 395) 施加了一些 限制。
与正常相反classes:
- 禁止在记录中声明实例字段显式(并提醒:所有字段都是
final
,这是一个非常无能的区别); extends
子句不允许与 records 一起使用,因为每个 record 隐式 扩展 摘要classRecord;- record 不能使用以下任何修饰符声明:
abstract
、sealed
或non-sealed
(由于隐含final
); - 记录 无法声明实例初始值设定项 和本机方法.
记录是 “不可变数据的透明载体” 作为 JEP 395说。
它们被设计成简洁、默认构造函数、getters、hashCode/equals
和 toString()
将由编译器为您生成。因此,在 record 中,您只需声明自定义逻辑(if any),记录声明可以是 one-liner.
记录 与常规 最终 classes.
有很大不同另外,除了上面提到的特性之外,序列化/反序列化的机制被重新实现为条记录,所以反序列化不绕过构造函数。
In which case should I use a record?
简而言之,如果你的对象必须有状态,或者你需要扩展一个特定的class,那么在这种情况下你不能使用record
。
另一方面,如果您的对象只是携带数据,则它们不打算被修改或继承自其他 classes,那么它可能是作为 record
.
A final
class 简直就是无法扩展的。但这对 class 没有其他限制;它仍然可以有可变字段,完全封装它的状态等。
A record
是给定状态组件元组的透明载体,需要公开从其状态描述派生的 API。因此,记录受到更严格的约束,但作为这些约束的交换,您可以获得大量便利(构造函数、访问器、Object
方法)以及一些语义承诺(例如,使用其组件访问器解包记录并用构造函数重新打包结果给你一个 equals
对象。)
记录也恰好是final
class,但这只是记录的一小部分。