为什么不应该专门使用案例类?
毕竟,他们提倡不变性,模式匹配访问方法等?
人们经常使用案例类,然后尝试自定义/滥用它们来做除了案例类应该做的其他事情.
例如,如果你想
使一些领域私有化
自定义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> max的范围是不可能的.
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)
您还必须覆盖复制方法.当你把它变得非常无懈可击时,你也可以使用普通的课程.