简单来说,Java 17 中的 final 类 和 record 有什么区别?
什么情况下应该使用记录?
Record是一个不可变类,即它的所有字段都是
final
。 记录是隐式的final
,因此常规的最终课程record
不能被扩展。
记录有许多限制(有关更多详细信息,请查看JEP 395)。
与正常课程相反:
final
,这是一个非常重要的区别);extends
子句不允许与records一起使用,因为每个record隐式地扩展抽象类Record;abstract
、sealed
或 non-sealed
(由于隐式 final
);记录意味着 “不可变数据的透明载体”,正如 JEP 395 所说。
它们被设计为简洁,默认构造函数,getters,
hashCode/equals
和toString()
将由编译器为您生成。因此,在 record 中,您只需要声明自定义逻辑(如果有的话),并且记录声明实际上可以是 one-liner。
记录与常规期末课程有很大不同。
此外,除了上面提到的特性之外,记录重新实现了序列化/反序列化机制,因此反序列化不会绕过构造函数。
什么情况下应该使用记录?
简而言之,如果您的对象必须是有状态,或者您需要扩展特定类,那么在这种情况下您不能使用
record
。
另一方面,如果您的对象只是携带数据,它们不打算被修改或从其他类继承,那么它可能是实现为
record
的不错选择。
final
类只是一个无法扩展的类。但这并没有对班级施加任何其他限制;它仍然可以具有可变字段、完全封装其状态等。
A
record
是给定状态组件元组的透明载体,并且需要公开从其状态描述派生的 API。因此,记录受到更严格的约束,但作为这些约束的交换,您可以获得很大的便利(构造函数、访问器、Object
方法)以及一些语义承诺(例如,使用其组件访问器解包记录并重新打包)构造函数的结果给你一个 equals
对象。)
记录也恰好是
final
类,但这只是记录含义的一小部分。