scala - 我可以在 Scala 中定义 “method-private” 字段吗?

标签 scala initialization private access-modifiers

鉴于这种情况:

object ResourceManager {

  private var inited = false

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

}

有什么办法可以让inited以某种方式“私有(private)于 init()”,因此我可以确定该类中没有其他方法能够设置 inited = false ?

最佳答案

取自 In Scala, how would you declare static data inside a function? .不要使用方法而是函数对象:

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

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

      inited = true
  }
}

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

请注意,它的行为与方法不同。 IE。在没有参数的情况下调用它是完全有效的。然后它的行为就像一个带有下划线 method _ 的方法。 ,这意味着它只会返回匿名函数而不会提示。

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

关于scala - 我可以在 Scala 中定义 “method-private” 字段吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4400926/

相关文章:

scala - 使用 spark 和 scala 将文件写入 S3 非常慢。有什么更好的方法来优化它?

scala - Play Framework 2.2 Action 组合返回自定义对象

swift - 创建 NSStackView 的子类

C++ bool 变量变化

scala - 如何在 Spark Scala 中使用 Graph.fromEdgeTuples 从 CSV 文件创建图形

scala - 可以对类型进行分组以传递给泛型类吗?

c++ - 初始化一个大的全局常量对象

ios - 在 Swift 中处理初始化失败

javascript - 在运行时选择私有(private)字段

ios - 为什么私有(private)属性会列在 iOS 头文件中?