如何将构造函数变量(sic!)公开为只读?

时间:2010-01-07 19:34:43

标签: scala

我有关于Scala的这个相当简单的问题。鉴于我必须遵循类定义:

class Foo(var bar: Int)

能够构建Foo实例的代码必须能够传递bar的初始值。但是,如果我将bar定义为var,则用户也可以在运行时更改其值,这不是我想要的。用户应该只能阅读bar。 <{1}}本身在内部被修改,因此bar不是一个选项。

1 个答案:

答案 0 :(得分:13)

对于属性的只读很简单,只需创建一个没有相应setter的getter方法。私人可修改的领域也很容易。

您最大的挑战是共享命名空间,您希望能够使用相同的名称:

  • 构造函数param
  • 内部可修改字段
  • the public 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关键字。