Rüd*_*ehn 15
人们经常使用案例类,然后尝试自定义/滥用它们来做除了案例类应该做的其他事情.
例如,如果你想
你应该使用普通的类,即使你需要输入更多.
对纯,不可变和公共数据使用案例类.基本上是一个带有命名元素的元组,仅此而已.使用普通类来处理可变资源的句柄(文件,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
Run Code Online (Sandbox Code Playgroud)
您可能认为通过使构造函数成为私有,可以强制执行不变量.在下面的示例中,您可能认为创建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)
}
Run Code Online (Sandbox Code Playgroud)
但事实并非如此:
scala> val wrong = Range.create(2,1).copy(min = 1000)
wrong: Range = Range(1000,2)
Run Code Online (Sandbox Code Playgroud)
您还必须覆盖复制方法.当你把它变得非常无懈可击时,你也可以使用普通的课程.
| 归档时间: |
|
| 查看次数: |
500 次 |
| 最近记录: |