案例类有一些很好的perc,比如copy, hashCode, toString, Pattern Matching。为什么不将每个Scala类都作为案例类?
答案 0 :(得分:8)
case class
非常适合保存复杂的值,例如实体对象。它们被认为恰恰适用于这种情况,因此它们通过合成您提到的方法并进一步创建类Serializable
并使用“工厂”方法创建伴随对象,为您提供精确适用于此用例的方法(其他比模式匹配的提取器。)
缺点如下:
case class
所拥有的某些属性对于您正在创建的类可能不感兴趣:您是否希望在持有数据库连接的对象上使用equals
方法?它Serializable
会有意义吗?如果确实如此,它会安全吗?
所有这些功能都不是免费的:它们需要编译器做一些额外的工作并添加到你的最终工件大小;如果您不需要case class
提供的额外功能,为什么要使用这些功能?
您无法从case class
继承到另一个case class
,这可能违反您对域建模的方式。为什么?简答:平等。您可以找到更长的答案here。
答案 1 :(得分:3)
案例类具有明确的语义 - data container
(更好的POJO或ADT块,取决于您的背景)。
有时像copy
或unapply
这样的方法可能会产生令人困惑的含义 - 例如如果字段是可变的。案例类旨在用于“惯用的scala样式”,可能并不适用于所有地方。
最后但并非最不重要 - 技术缺点(.class中的代码越多,序列化的代码越多,继承问题)。