我可以在Scala中定义"方法 - 私有"字段吗?

Jea*_*let 3 scala initialization private access-modifiers

鉴于这种情况:

object ResourceManager {

  private var inited = false

  def init(config: Config) {
    if (inited)
      throw new IllegalStateException
    // do initialization
    inited = true
  }

}
Run Code Online (Sandbox Code Playgroud)

有什么方法可以让我以inited某种方式"私有init()",这样我可以确定这个类中没有其他方法能够设置inited = false

Deb*_*ski 6

Scala中获取,如何在函数内声明静态数据?.不要使用方法而是使用函数对象:

val init = { // or lazy val
  var inited = false

  (config: Config) => {
      if (inited)
          throw new IllegalStateException

      inited = true
  }
}
Run Code Online (Sandbox Code Playgroud)

在外部范围(在情况下val)或第一次访问(lazy val)的初始化期间,执行变量的主体.因此,inited设置为false.最后一个表达式是一个匿名函数,然后分配给它init.init然后,每次进一步访问都将执行此匿名函数.

请注意,它的行为与方法不完全相同.即,没有参数调用它是完全有效的.它的行为就像一个带尾随下划线的方法method _,这意味着它只会返回匿名函数而不会抱怨.

如果由于某种原因,您实际上需要方法行为,您可以将其设为a private val _init = ...并从公共场所调用它def init(config: Config) = _init(config).


Dav*_*ith 5

以下绝对算作更值得的麻烦,但确实满足规格.否则就没办法这样做了

object ResourceManager {

  private object foo {
     var inited = false
     def doInit(config:Config){
       if (inited)
         throw new IllegalStateException
       // do initialization
       inited = true
     }
  }


  def inner(config: Config) {
      foo.doInit(config)
  }

}
Run Code Online (Sandbox Code Playgroud)