Given this situation:
object ResourceManager {
private var inited = false
def init(config: Config) {
if (inited)
throw new IllegalStateException
// do initialization
inited = true
}
}
Is there any way that I could make inited
somehow “private to init()”, such that I can be sure that no other method in this class will ever be able to set inited = false
?
It would be easier to create a "trapdoor" object which can only go from false to true:
If all you want to do is make sure that
init
is called once, do something like this:that way the initialization code will only run once, however many times you run
init
, andinited
cannot get another value since it's aval
. The only downside is that as soon asinited
is queried for its value the initialization will run...Taken from In Scala, how would you declare static data inside a function?. Don’t use a method but a function object:
During initialisation of the outer scope (in case of
val
) or first access (lazy val
), the body of the variable is executed. Thus,inited
is set tofalse
. The last expression is an anonymous function which is then assigned toinit
. Every further access toinit
will then execute this anonymous function.Note that it does not behave exactly like a method. I.e. it is perfectly valid to call it without arguments. It will then behave like a method with trailing underscore
method _
, which means that it will just return the anonymous function without complaining.If for some reason or another, you actually need method behaviour, you could make it a
private val _init = ...
and call it from publicdef init(config: Config) = _init(config)
.The below absolutely counts as way more trouble that it's worth, but does satisfy the specs. There's no way to do so otherwise