Les classes sont chargées lorsqu'on exécute un de leurs codes ou qu'on accède à un des leurs éléments.
Pour un singleton ce sera donc lors de l'appel de
getInstance() dans la plupart des cas... A moins qu'il ne possède d'autres attributs/méthodes static publique...
Et si on veut vraiment déporter la création de l'instance, il suffit d'utiliser une classe interne :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| final class Singleton {
private static class Holder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton() {
// ...
}
public static Singleton getInstance() {
return Holder.INSTANCE;
}
} |
:arrow: La classe "Holder" ne sera chargée que lors du premier appel de
getInstance(). Tout comme notre instance de singleton ;)
De plus ce genre de code est très facile à optimiser pour un compilateur :
- Il est très court et peut être facilement "inliné".
- On fait un accès sur un champ static final. Il n'y a aucune synchro à faire puisqu'on est sûr que cette référence ne sera jamais modifié.
a++