为什么不应该只使用一个用例类?
毕竟,它们促进了不变性,通过访问器方法进行模式匹配等?
最佳答案
人们经常使用案例类,然后尝试自定义/滥用它们来做一些案例类应该做的事情。
例如。如果你想
您应该使用普通类,即使您必须输入更多内容。
对纯、不可变和公共(public)数据使用案例类。基本上是一个带有命名元素的元组,仅此而已。使用普通类,例如可变资源(文件、GUI 控件等)的句柄
人们经常认为您可以滥用案例类来完成为普通类保留的任务。所以这里有一些滥用案例类的例子:
私有(private)成员(member)
案例类的成员从来都不是真正私有(private)的
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
私有(private)构造函数
您可能认为通过将构造函数设为私有(private),可以强制执行不变量。在下面的示例中,您可能认为不可能创建 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)
您还必须覆盖复制方法。等到您真正做到了无懈可击时,您还不如使用普通类。
关于scala - 为什么不应该只使用一个用例类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34719507/