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?
从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).
以下绝对算作更值得的麻烦,但确实满足规格.否则就没办法这样做了
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)