Un objet immuable est initialisé uniquement par son constucteur, tandis qu'un singleton est instancié par une méthode statique. Comment faire un singleton immuable en Java?Comment créer un singleton immuable en Java?
Répondre
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:
- Java tutorial: Enum Types
- Effective Java, article 3
- Singleton (the enum way) (WikiPedia)
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-)
public enum MySingleton {
instance;
//methods
}
//usage
MySingleton.instance.someMethod();
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;
}
}
yup, c'est celui que j'ai appelé 'initialize-through-static-inner-class pattern' :-) +1 –
@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 :) –
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.
- 1. Comment créer un répertoire immuable dans svn?
- 2. Comment créer une classe Singleton inter-processus en Java
- 3. Créer une classe immuable
- 4. Comment créer un singleton JVM-global?
- 5. Comment créer un membre const pour un type immuable?
- 6. Singleton avec subclassing en java
- 7. Extension d'un singleton en Java
- 8. créer un objet constant en Java
- 9. Comment puis-je créer un singleton IEnumerable?
- 10. C# - Comment créer un objet immuable avec LINQ to Objects
- 11. Meilleure façon de créer un tableau singleton
- 12. val ou objet pour objet singleton final immuable
- 13. Cloner ou créer un MailMessage immuable dans .NET/C#
- 14. Comment créer une classe immuable en Java sans utiliser mot-clé finale
- 15. Comment créer une application singleton?
- 16. Comment convertir un java.util.Collections.unmodifiableMap en un Scala Map immuable?
- 17. Java singleton classe interne
- 18. ruby - créer un singleton avec des paramètres?
- 19. java singleton thread safe
- 20. L'objet immuable en python
- 21. Technique utilisée en java pour rendre la chaîne immuable?
- 22. Créer un événement sur Singleton Classe
- 23. Implémentation du modèle singleton en Java
- 24. Java: est une référence finale à un tableau d'énumérations immuable?
- 25. Objet ArrayList et Singleton en Java
- 26. Comment créer une valeur singleton nsdictionary
- 27. Java Singleton NullPointerException
- 28. Comment créer un éditeur d'image en Java?
- 29. Comment créer un tableau JSON en Java
- 30. Comment créer un formulaire MDI en Java
battement de 12 secondes = [ – KitsuneYMG
Cet exemple est tiré de Effective Java, je suppose ;-) – darioo
@darioo: oui, mais il manque la méthode 'leaveTheBuilding()' :-) –