即使我实现所有的hashCode(),equals()和toString(),我应该使用数据类吗?

问题描述:

我有一个类是一个字符串的解析结果,所以我必须执行toString()来返回该源字符串,而不是那些解析的值。它还具有自定义equals()/ hashCode()机制。将它标记为数据类还有什么好处吗?即使我实现所有的hashCode(),equals()和toString(),我应该使用数据类吗?

数据类的自动生成的部分是:

编译器自动导出从主构造中声明的所有 属性下列成员:

- equals()/hashCode() pair, 
- toString() of the form "User(name=John, age=42)", 
- componentN() functions corresponding to the properties in their order of declaration, 
- copy() function. 

如果任何的这些功能是在类体中明确定义或从基类继承的 ,它不会被生成。

componentN()功能可使解构像for ((a, b, c) in dataClass) { ... }

然而,数据类不能继承。 (你可以定义一个扩展另一个非数据类的数据类)

如果你认为某些类可能扩展你的类,那么不要把它作为数据类。

如果您认为将来没有类会扩展您的类,并且您可能需要销毁或copy()函数,那么将其设为数据类。

+0

感谢您列出所有这些。我现在有信心将其标记为数据类。它不应该以任何方式扩展并且可以使用解构。 – glee8e