为什么不将每个Scala类都作为案例类?

时间:2016-10-04 12:40:46

标签: scala

案例类有一些很好的perc,比如copy, hashCode, toString, Pattern Matching。为什么不将每个Scala类都作为案例类?

2 个答案:

答案 0 :(得分:8)

case class非常适合保存复杂的值,例如实体对象。它们被认为恰恰适用于这种情况,因此它们通过合成您提到的方法并进一步创建类Serializable并使用“工厂”方法创建伴随对象,为您提供精确适用于此用例的方法(其他比模式匹配的提取器。)

缺点如下:

  • case class所拥有的某些属性对于您正在创建的类可能不感兴趣:您是否希望在持有数据库连接的对象上使用equals方法?它Serializable会有意义吗?如果确实如此,它会安全吗?

  • 所有这些功能都不是免费的:它们需要编译器做一些额外的工作并添加到你的最终工件大小;如果您不需要case class提供的额外功能,为什么要使用这些功能?

  • 您无法从case class继承到另一个case class,这可能违反您对域建模的方式。为什么?简答:平等。您可以找到更长的答案here

答案 1 :(得分:3)

案例类具有明确的语义 - data container(更好的POJO或ADT块,取决于您的背景)。

有时像copyunapply这样的方法可能会产生令人困惑的含义 - 例如如果字段是可变的。案例类旨在用于“惯用的scala样式”,可能并不适用于所有地方。

最后但并非最不重要 - 技术缺点(.class中的代码越多,序列化的代码越多,继承问题)。