Bonjour,

j'aimerais bien qu'on m'explique à quoi sert le design pattern support d'initialisation à la demande (initialization on demand holder). Je n'ai pas trop compris la différence avec le simple singleton.

Singleton :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
public class Singleton
{
  private static final Singleton INSTANCE = new Singleton();
  private Singleton() {}
  public static Singleton getInstance() {return INSTANCE;}
}
Initialization on demand holder :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
public class Singleton
{
  private Singleton() {}
  private static class SingletonHolder
  {
    public static final Singleton INSTANCE = new Singleton();
  }
  public static Singleton getInstance()
  {
    return SingletonHolder.INSTANCE;
  }
}
Je sais que les variables static sont initialisées à l'initialisation de la classe et qu'en mettant INSTANCE à l'intérieur d'une méthode, cette initialisation n'a donc pas lieu en même temps que celle de la classe mais seulement à l'appel de getInstance(). Mais ça change quoi ?

J'ai cru comprendre que c'était pour éviter que deux threads concurrents ne puissent se retrouver avec des instances différentes su Singleton, mais là j'ai pas compris comment...