【问题标题】:Should I use data class even if I implement all of hashCode(), equals() and toString()?即使我实现了所有的 hashCode()、equals() 和 toString(),我是否应该使用数据类?
【发布时间】:2018-06-24 12:44:04
【问题描述】:

我有一个类是字符串的解析结果,所以我必须强制 toString() 返回源字符串而不是那些解析的值。它还具有自定义的 equals()/hashCode() 机制。仍然将其标记为数据类有什么好处吗?

【问题讨论】:

    标签: kotlin data-class


    【解决方案1】:

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

    编译器会自动从所有 在主构造函数中声明的属性:

    - 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) { ... } 那样进行解构

    但是,数据类不能被继承。 (您可以定义一个扩展另一个非数据类的数据类。)

    如果您认为某些类可能会扩展您的类,请不要将其设为数据类。

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

    【讨论】:

    • 感谢您列出所有这些。我现在有信心将其标记为数据类。它不应该以任何方式扩展,并且可以使用解构。
    猜你喜欢
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    相关资源
    最近更新 更多