我有关于Scala的这个相当简单的问题。鉴于我必须遵循类定义:
class Foo(var bar: Int)
能够构建Foo
实例的代码必须能够传递bar
的初始值。但是,如果我将bar
定义为var
,则用户也可以在运行时更改其值,这不是我想要的。用户应该只能阅读bar
。 <{1}}本身在内部被修改,因此bar
不是一个选项。
答案 0 :(得分:13)
对于属性的只读很简单,只需创建一个没有相应setter的getter方法。私人可修改的领域也很容易。
您最大的挑战是共享命名空间,您希望能够使用相同的名称:
可悲的是,这是不可能的,你需要为每个角色都有一个不同的名字......就像这样:
class Bippy(bop0: Int) {
private[this] var privatebop = bop0
//privatebop is ONLY EVER used by the following getter and setter:
private def bop_=(x:Int) = privatebop = x
def bar = privatebop
}
如果您不关心使用命名参数,或者使用Scaladoc中参数的名称,那么可以进一步缩短这一点:
class Bippy(private[this] var privatebop) {
//privatebop is ONLY EVER used by the following getter and setter:
private def bop_=(x:Int) = privatebop = x
def bop = privatebop
}
<强>更新强>
可以说,最干净的方法可以让你回到命名参数,将工厂与上述技术结合起来:
object Bippy{
def apply(bop: Int) = new Bippy(bop)
}
然后可以将其称为Bippy(42)
。与常规构造函数相同,但没有new
关键字。