鉴于这种情况:
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/