Я використовую блок статичного коду для ініціалізації деяких контролерів у реєстрі, який у мене є. Моє запитання полягає в тому, чи можу я гарантувати, що цей блок статичного коду буде абсолютно викликаний лише один раз при першому завантаженні класу? Я розумію, що не можу гарантувати, коли цей код коду буде викликаний, я здогадуюсь його, коли Classloader вперше завантажить його. Я усвідомлюю, що міг би синхронізуватися на класі в блоці статичного коду, але я здогадуюсь, що це насправді те, що відбувається все одно?
Простий приклад коду буде;
class FooRegistry {
static {
//this code must only ever be called once
addController(new FooControllerImpl());
}
private static void addController(IFooController controller) {
// ...
}
}
або я повинен це робити;
class FooRegistry {
static {
synchronized(FooRegistry.class) {
addController(new FooControllerImpl());
}
}
private static void addController(IFooController controller) {
// ...
}
}