在scala中使用类字段的最佳方法是在类之外是只读的吗?我意识到我可以做这样的事情:
private var myvalX = 0 // default val
def myval = myvalX
def myval_=(x: Int) { myvalX = x }
但由于_ =运算符以及您需要定义一个名称与方法不同的单独var,我发现它非常难看。替代品将非常受欢迎。谢谢!
答案 0 :(得分:8)
我认为将私有字段和公共字段共享同名是不错的做法。例如,你写了
private var myvalX = 0 // default val
def myval = myvalX
def myval_=(x: Int) { myvalX = x }
根本不会使myval
只读!你可能意味着像
private def myval_=(x: Int) { myvalX = x }
这是只读的。但这是一个很好的例子,说明为什么这是一个坏主意 - 你要求公共接口和私人实现细节之间的混淆。可能出现的其他问题是用户没有意识到值可能会从它们下面改变,子类重新定义公共getter而没有意识到私有setter不可用,等等。
如果您不尝试共享该名称,那么更清楚的是有两件事需要考虑:您的基础数据以及依赖于该数据的公共接口。
private var myData = 0
def data = myData
那不是那么糟糕,是吗?
或者,如果您真的坚持使用此模式,您可以使用各种技巧使事情看起来更好。例如,如果你有一堆字段,你可以
class C {
abstract class ReadOnly[A] { def value: A }
private class ReadWrite[A](var value: A) extends ReadOnly[A]
private implicit def access[A](ro: ReadOnly[A]) = ro.asInstanceOf[ReadWrite[A]]
def rw[A](a: A): ReadOnly[A] = new ReadWrite(a)
val data = rw(0)
val comment = rw("Ho-hum")
}
它会让C类中的任何内容设置为data.value
和comment.value
,并且只允许其他人阅读它们。 (编辑:修改为包含原始示例中的所有好东西,因为如果省略它们,则可能会出错。)