2011-02-03 5 views

Répondre

7

tandis qu'un singleton est instancié par une méthode statique

Bien que ce soit la manière habituelle de le faire, cela est loin d'être la seule façon.

Dans Java 1.5 une nouvelle version de Singleton est le motif de singleton ENUM:

public enum Elvis{ 

INSTANCE // this is a singleton, no static methods involved 

} 

Et depuis énumérations peuvent avoir des constructeurs, des méthodes et des champs, vous pouvez leur donner tout l'état immuable que vous voulez.

Référence:


En outre, le terme Singleton laisse une certaine marge pour i interprétation Singleton signifie qu'il ya exactement un objet par champ défini, mais la portée peut être un certain nombre de choses:

  • Java VMClassloader (merci @ paulo Ebermann pour me rappeler): dans ce cas, utilisez enums ou le initialize-through-static-inner-class pattern. C'est bien entendu ce que l'on entend habituellement par singleton.
    Attention: les enums et tous les autres singletons sont endommagés s'ils sont chargés via plusieurs chargeurs de classe.
  • Application d'entreprise (dans ce cas, vous avez besoin d'un singleton géré par conteneur, par exemple Spring singleton bean). Cela peut être plusieurs objets par VM ou un objet par plusieurs machines virtuelles (ou un objet par VM, bien sûr)
  • Discussion (utilisez un ThreadLocal)
  • Demande/session (encore une fois, vous besoin d'un conteneur pour gérer cela, Spring, Seam et plusieurs autres peuvent le faire pour vous)
  • ai-je oublié quelque chose?

Toutes les précédentes peuvent être immuable, chacun à leur manière (même si elle est généralement pas facile pour les composants gérés par conteneur-)

+1

battement de 12 secondes = [ – KitsuneYMG

+0

Cet exemple est tiré de Effective Java, je suppose ;-) – darioo

+0

@darioo: oui, mais il manque la méthode 'leaveTheBuilding()' :-) –

1
public enum MySingleton { 
instance; 
//methods 
} 

//usage 
MySingleton.instance.someMethod(); 
5

La solution a par Sean est un bon moyen de initialiser des singletons si leur création n'est pas chère. Si vous voulez une capacité de "chargement paresseux", regardez dans l'idiome de l'initialisation à la demande.

// from wikipedia entry 
public class Singleton { 

    // Private constructor prevents instantiation from other classes 
    private Singleton() { 
    } 

    /** 
    * SingletonHolder is loaded on the first execution of Singleton.getInstance() 
    * or the first access to SingletonHolder.INSTANCE, not before. 
    */ 
    private static class SingletonHolder { 
    public static final Singleton INSTANCE = new Singleton(); 
    } 

    public static Singleton getInstance() { 
    return SingletonHolder.INSTANCE; 
    } 

} 
+0

yup, c'est celui que j'ai appelé 'initialize-through-static-inner-class pattern' :-) +1 –

+0

@Sean: Oh, je n'avais pas réalisé que vous faisiez référence à la même chose. Je suppose que votre réponse était en effet complète. +1 :) –

1

Vous êtes compliqué inutile. Pour être immuable, un objet doit être non modifiable une fois créé. Cela est normalement interprété comme signifiant "modifiable seulement dans le constructeur", mais si vous deviez le créer d'une autre manière qui le rendrait immuable. Tant que votre objet ne peut pas être modifié après son initialisation, il est immuable. Vous pouvez envisager de configurer l'instance Singleton pour faire partie de l'initialisation.

La plupart des avantages de l'immuabilité ne sont pas pertinents dans les Singletons.

Questions connexes