Tiré de In Scala, how would you declare static data inside a function?. Ne pas utiliser une méthode, mais un objet de fonction:
val init = { // or lazy val
var inited = false
(config: Config) => {
if (inited)
throw new IllegalStateException
inited = true
}
}
Lors de l'initialisation du champ extérieur (en cas de val
) ou au premier accès (lazy val
), le corps de la variable est exécutée. Par conséquent, inited
est défini sur false
. La dernière expression est une fonction anonyme qui est ensuite affectée à init
. Chaque accès supplémentaire à init
exécutera alors cette fonction anonyme.
Notez qu'il ne se comporte pas exactement comme une méthode. C'est à dire. il est parfaitement valable de l'appeler sans arguments. Il se comportera alors comme une méthode avec un trait de soulignement final method _
, ce qui signifie qu'il retournera simplement la fonction anonyme sans se plaindre.
Si pour une raison ou pour une autre, vous avez réellement besoin d'un comportement de méthode, vous pouvez en faire un private val _init = ...
et l'appeler du public def init(config: Config) = _init(config)
.
Voir aussi http://stackoverflow.com/questions/1516087 – Debilski