这是一个后续问题我之前的初始化变量问题 https://stackoverflow.com/questions/4400926/can-i-define-method-private-fields-in-scala.
假设我们正在处理这样的上下文:
object AppProperties {
private var mgr: FileManager = _
def init(config: Config) = {
mgr = makeFileManager(config)
}
}
这段代码的问题是任何其他方法AppProperties
可能会重新分配mgr
。有没有更好的封装技术mgr
所以感觉就像val
对于其他方法?我想过这样的事情(灵感来自这个答案 https://stackoverflow.com/questions/4400926/can-i-define-method-private-fields-in-scala/4401197#4401197):
object AppProperties {
private object mgr {
private var isSet = false
private var mgr: FileManager = _
def apply() = if (!isSet) throw new IllegalStateException else mgr
def apply(m: FileManager) {
if (isSet) throw new IllegalStateException
else { isSet = true; mgr = m }
}
}
def init(config: Config) = {
mgr(makeFileManager(config))
}
}
...但这对我来说感觉相当沉重(初始化让我想起了太多的 C++ :-))。还有其他想法吗?
您可以使用隐式来做到这一点,使隐式仅在应该能够重新分配的方法中可用。查看值不需要隐式,因此“变量”对其他方法是可见的:
sealed trait Access
trait Base {
object mgr {
private var i: Int = 0
def apply() = i
def :=(nv: Int)(implicit access: Access) = i = nv
}
val init = {
implicit val access = new Access {}
() => {
mgr := 5
}
}
}
object Main extends Base {
def main(args: Array[String]) {
println(mgr())
init()
println(mgr())
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)