Это дополнительный вопрос к моему предыдущему вопросу о переменной инициализации.
Предположим, мы имеем дело с этим контекстом:
object AppProperties {
private var mgr: FileManager = _
def init(config: Config) = {
mgr = makeFileManager(config)
}
}
Проблема с этим кодом в том, что любой другой метод в AppProperties
может переназначить mgr
. Есть ли способ лучше инкапсулировать mgr
, чтобы он воспринимался как val
для других методов? Я думал о чем-то подобном (вдохновленный этим ответ):
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++ :-)). Любая другая идея?