Я использую статический блок кода для инициализации некоторых контроллеров в реестре, который у меня есть. Поэтому мой вопрос: могу ли я гарантировать, что этот статический блок кода будет абсолютно вызван один раз, когда класс будет загружен первым? Я понимаю, что не могу гарантировать, когда этот кодовый блок будет вызван, я угадываю его, когда Classloader сначала загружает его. Я понимаю, что могу синхронизировать класс в статическом блоке кода, но я предполагаю, что это на самом деле то, что происходит в любом случае?Являются ли статические инициализаторы Java безопасными?
Простой пример кода;
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) {
// ...
}
}
Мне не нравится этот дизайн, так как он не подлежит проверке. Посмотрите на Injection Dependency. – dfa