Un bloc statique est un morceau de code qui est exécuté une fois lorsque la classe est initialisé par le chargeur de classe. Vous pouvez l'utiliser pour configurer votre objet complexe, puis garder une référence dans une variable statique comme ceci:
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;
}
}
Si vous faites cela dans un environnement multi-thread comme un servlet ou un webservice vous devez assurez-vous que l'état de LanguageLookup ne peut pas changer après son initialisation. S'il utilise ses propres dépendances pour des opérations autres que son initialisation, celles-ci doivent également être sans état.
Je pense que ce n'est généralement pas une bonne idée de le faire de cette façon parce que vous êtes en train de câbler votre classe au LanguageLookup, ce qui le rend étroitement couplé et plus difficile au test unitaire.
Il est très facile d'utiliser un cadre d'injection de dépendance comme le Printemps de mettre en place singletons:
Lorsqu'un haricot est un singleton, une seule partagé par exemple de la fève sera gérer et toutes les demandes de haricots avec un ID ou des ID correspondant à la définition du bean , une seule instance de bean spécifique sera renvoyée .
Dans le contexte de l'application que vous auriez quelque chose comme:
<bean name="languageLookup" class="com.acme.foo.LanguageLookup" singleton="true" init-method="loadData"/>
Et dans votre code:
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;
}
}
Les variables statiques sont partagées par des fils. Cependant, ils ne sont pas nécessairement thread-safe. Si votre objet est thread-safe, cela pourrait être une option. –
Il s'agit d'un objet en lecture seule. Mais les blocs statiques ne sont pas partagés avec le thread. est-ce ou n'est-ce pas? –