为什么不应该只使用一个案例类?

时间:2016-01-11 10:43:31

标签: scala

为什么不应该只使用一个案例类?

毕竟,他们提倡不变性,模式匹配访问方法等?

3 个答案:

答案 0 :(得分:14)

人们经常使用案例类,然后尝试自定义/滥用它们来做除了应该做的案例之外的其他事情。

E.g。如果你想

  • 将某些字段设为私有
  • 自定义equality / hashCode
  • 有可变状态
  • 在构造实例时强制执行不变量

你应该使用普通的类,即使你需要输入更多。

对纯,不可变和公共数据使用案例类。基本上是一个带有命名元素的元组,仅此而已。使用普通类例如处理可变资源(文件,GUI控件等)

人们经常认为您可以滥用案例类来执行为普通类保留的任务。所以这里有一些滥用案例类的例子:

私人会员

案例类的成员永远不会真正私有

case class Foo(x: Int, private val y: String)
val x = Foo(1, "Secret")
x.y // does not work, because y is private
x.productElement(1) // still does work
Foo.unapply(Foo(1,2)).get._2 // another, more typesafe way to get at the private fields

私有构造函数

您可能认为通过将构造函数设为私有,可以强制执行不变量。在下面的示例中,您可能认为无法使用min>创建范围。最大

case class Range private (min: Int, max: Int)
object Range {
  def create(a: Int, b: Int): Range =
    if(a < b) new Range(a, b) else new Range(b, a)     
}

但事实并非如此:

scala> val wrong = Range.create(2,1).copy(min = 1000)
wrong: Range = Range(1000,2)

您还必须覆盖复制方法。当你把它变得非常无懈可击时,你可能也使用了普通的课程。

答案 1 :(得分:0)

因为你根本就不需要它们。默认情况下,他们会生领域的公共吸气剂。还有哪些案例类会自动创建一个与该类名称相同的伴随对象,其中包含applyunapply方法。

答案 2 :(得分:0)

案例类并不普遍。当您不希望所有字段都公开和/或不关心默认比较和克隆逻辑,或者您需要非平凡的访问器或初始化逻辑时,它们是无用的。

他们也不能拥有超过22个成员,并且你不能构建他们的层次结构(至少,不是它们的唯一,因为禁止继续使用case-to-case,但是甚至扩展一个常规类的case case isn&# 39;非常好的主意)。