Używam bloku kodu statycznego do zainicjowania niektórych kontrolerów w rejestrze, który mam. Moje pytanie brzmi zatem, czy mogę zagwarantować, że ten statyczny blok kodu zostanie wywołany tylko raz, gdy klasa zostanie po raz pierwszy załadowana? Rozumiem, że nie mogę zagwarantować, kiedy ten blok kodu zostanie wywołany, zgaduję, że kiedy Classloader po raz pierwszy go załaduje. Zdaję sobie sprawę, że mogę zsynchronizować się z klasą w bloku kodu statycznego, ale przypuszczam, że tak właśnie się dzieje?
Prosty przykład kodu byłby;
class FooRegistry {
static {
//this code must only ever be called once
addController(new FooControllerImpl());
}
private static void addController(IFooController controller) {
// ...
}
}
czy powinienem to zrobić;
class FooRegistry {
static {
synchronized(FooRegistry.class) {
addController(new FooControllerImpl());
}
}
private static void addController(IFooController controller) {
// ...
}
}