最终课程和记录有什么区别?

问题描述 投票:0回答:2

简单来说,Java 17 中的 final 类record 有什么区别?

什么情况下应该使用记录?

java record java-17 final-class
2个回答
15
投票

Record是一个不可变类,即它的所有字段都是

final
记录是隐式的
final
,因此常规的最终课程
record
不能被扩展

记录有许多限制有关更多详细信息,请查看JEP 395)。

正常课程相反

  • 禁止在记录内声明实例字段显式提醒:所有字段都是
    final
    这是一个非常重要的区别);
  • extends
    子句不允许与records一起使用,因为每个record隐式地扩展抽象类Record;
  • record 不能使用以下任何修饰符进行声明:
    abstract
    sealed
    non-sealed
    (由于隐式
    final
    );
  • 记录无法声明实例初始值设定项本机方法

记录意味着 “不可变数据的透明载体”,正如 JEP 395 所说。

它们被设计为简洁默认构造函数getters

hashCode/equals
toString()
将由编译器为您生成。因此,在 record 中,您只需要声明自定义逻辑(如果有的话),并且记录声明实际上可以是 one-liner

记录与常规期末课程有很大不同。

此外,除了上面提到的特性之外,记录重新实现了序列化/反序列化机制,因此反序列化不会绕过构造函数。

什么情况下应该使用记录?

简而言之,如果您的对象必须是有状态,或者您需要扩展特定类,那么在这种情况下您不能使用

record

另一方面,如果您的对象只是携带数据,它们不打算被修改或从其他类继承,那么它可能是实现为

record
的不错选择。


13
投票

final
类只是一个无法扩展的类。但这并没有对班级施加任何其他限制;它仍然可以具有可变字段、完全封装其状态等。

A

record
是给定状态组件元组的透明载体,并且需要公开从其状态描述派生的 API。因此,记录受到更严格的约束,但作为这些约束的交换,您可以获得很大的便利(构造函数、访问器、
Object
方法)以及一些语义承诺(例如,使用其组件访问器解包记录并重新打包)构造函数的结果给你一个
equals
对象。)

记录也恰好是

final
类,但这只是记录含义的一小部分。

© www.soinside.com 2019 - 2024. All rights reserved.