为什么不应该只使用一个案例类?
毕竟,他们提倡不变性,模式匹配访问方法等?
答案 0 :(得分:14)
人们经常使用案例类,然后尝试自定义/滥用它们来做除了应该做的案例之外的其他事情。
E.g。如果你想
你应该使用普通的类,即使你需要输入更多。
对纯,不可变和公共数据使用案例类。基本上是一个带有命名元素的元组,仅此而已。使用普通类例如处理可变资源(文件,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)
因为你根本就不需要它们。默认情况下,他们会生领域的公共吸气剂。还有哪些案例类会自动创建一个与该类名称相同的伴随对象,其中包含apply
和unapply
方法。
答案 2 :(得分:0)
案例类并不普遍。当您不希望所有字段都公开和/或不关心默认比较和克隆逻辑,或者您需要非平凡的访问器或初始化逻辑时,它们是无用的。
他们也不能拥有超过22个成员,并且你不能构建他们的层次结构(至少,不是它们的唯一,因为禁止继续使用case-to-case,但是甚至扩展一个常规类的case case isn&# 39;非常好的主意)。