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 不能使用以下任何修饰符声明:abstractsealednon-sealed(由于隐含 final);
  • 记录 无法声明实例初始值设定项本机方法.

记录是 “不可变数据的透明载体” 作为 JEP 395说。

它们被设计成简洁默认构造函数gettershashCode/equalstoString() 将由编译器为您生成。因此,在 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 对象。)

记录也恰好是finalclass,但这只是记录的一小部分。