我有关于Scala的这个相当简单的问题.鉴于我必须遵循类定义:
class Foo(var bar: Int)
Run Code Online (Sandbox Code Playgroud)
能够构造实例的代码Foo必须能够传递初始值bar.但是,如果我定义bar为var用户也能够在运行时更改其值,这不是我想要的.用户应该只能阅读bar.bar本身是内部修改的,因此val不是一种选择.
Kev*_*ght 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
}
Run Code Online (Sandbox Code Playgroud)
如果您不关心使用命名参数,或者使用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
}
Run Code Online (Sandbox Code Playgroud)
UPDATE
可以说,最干净的方法可以让你返回命名参数,它将工厂与上述技术之一结合起来:
object Bippy{
def apply(bop: Int) = new Bippy(bop)
}
Run Code Online (Sandbox Code Playgroud)
然后可以将其称为Bippy(42).与常规构造函数相同,但没有new关键字.