Статический блок представляет собой кусок кода, который выполняется один раз, когда класс инициализируется загрузчик классов. Вы можете использовать его, чтобы создать свой сложный объект, а затем сохранить ссылку на него в статической переменной следующим образом:
public class MyClass {
private static final LanguageLookup languageLookup;
static {
languageLookup = new LanguageLookup();
languageLookup.loadData();
}
public Response handleRequest(Request request) {
String language = languageLookup.lookup(request.getCountryCode());
response.setLanguage(language);
return response;
}
}
Если вы делаете это в многопоточной среде, как сервлет или веб-сервиса вам нужно убедитесь, что состояние LanguageLookup не может измениться после его инициализации. Если он использует собственные зависимости для операций, отличных от его инициализации, они также должны быть неактивными.
Я думаю, что это вообще не очень хорошая идея, потому что вы жестко подключаете свой класс к LanguageLookup, делая его плотно связанным и более сложным для тестирования.
Это очень простой в использовании рамки инъекции зависимостей, как Spring, чтобы установить singletons:
Когда фасоль одноэлементно, только один общий экземпляр компонента будет управляться и все запросы на бобах с идентификатором или идентификаторами, соответствующими этому определению , приведет к тому, что один конкретный экземпляр компонента будет возвращен .
В контексте приложения вы бы что-то вроде:
<bean name="languageLookup" class="com.acme.foo.LanguageLookup" singleton="true" init-method="loadData"/>
И в вашем коде:
public class MyClass {
private LanguageLookup languageLookup;
public Response handleRequest(Request request) {
String language = languageLookup.lookup(request.getCountryCode());
response.setLanguage(language);
return response;
}
// called by Spring
public void setLanguageLookup(LanguageLookup languageLookup) {
this.languageLookup = languageLookup;
}
}
Статические переменные являются общими нитями. Однако они не обязательно являются потокобезопасными. Если ваш объект является потокобезопасным, это может быть вариант. –
Это объект только для чтения. Но статические блоки не разделяются в потоке. это или нет? –