2010-01-14 10 views
3

Je veux créer une instance unique d'une classe. Comment puis-je créer une seule instance d'une classe en Java?Instance unique de la classe Java

+6

'new MyClass()' exécuté une fois? –

+2

OT - citation de la question précédente: "Je suis très familier avec le langage de programmation Java" - girinie, honnêtement, je ne m'attendais pas à cette question - vous * devez * améliorer vos compétences Java avant d'attaquer votre projet de boutique en ligne //stackoverflow.com/questions/2055016/web-site-design-idea-closed)! Au moins, vous devriez connaître (maître?) Les modèles du GoF. –

Répondre

17

Pour créer une instance véritablement unique de votre classe (impliquant un singleton au niveau de la JVM), vous devez faire de votre classe un Java enum. Le motif singleton utilise un état statique et, par conséquent, entraîne généralement des dégâts lors du test unitaire.

Ceci est expliqué à l'article 3 de la version Java de Joshua Bloch.

+0

Pour être exact, le singleton sera seulement au niveau du loadloader, avoir à contrôler tous les chargeurs de classe dans une JVM pour être en mesure de garantir un singleton au niveau de la JVM – pgras

+0

Je pense que vous trouverez que c'est un abus de ce que l'on veut faire. Une énumération concerne plusieurs éléments connexes (par exemple, les jours de la semaine), de sorte que vous pouvez avoir un moyen sûr d'exécuter des commutations/comparaisons, etc. Il ne s'agit pas d'une instance unique d'une classe. Les singletons se compliquent avec différentes structures de classloader, mais c'est le cas quelle que soit la façon dont vous l'implémentez. – Shane

+0

@Shane, reportez-vous à Java efficace. Les énumérations Java sont beaucoup plus que les énumérations simples disponibles dans d'autres langues. – gpampara

5

utilisez le motif singleton.

Singleton pattern

Mise à jour:

Quel est le modèle singleton? Le pattern singleton est un modèle de conception qui est utilisé pour restreindre instanciation d'une classe à un objet

+1

-1 évidemment .. mais il ne veut pas savoir COMMENT – lexu

+1

C'est pourquoi j'ai ajouté un lien. Il est inutile de répéter la même information ici –

+0

n'a pas vu le lien, votre modification et mon commentaire doit avoir été asynchrone .. J'ai supprimé le -1 – lexu

10

singleton Très basique.

public class Singleton { 
    private static Singleton instance; 

    static { 
    instance = new Singleton(); 
    } 

    private Singleton() { 
    // hidden constructor 
    }  

    public static Singleton getInstance() { 
    return instance; 
    } 
} 

Vous pouvez également utiliser le modèle de support paresseux et

public class Singleton { 

    private Singleton() { 
    // hidden constructor 
    } 

    private static class Holder { 
    static final Singleton INSTANCE = new Singleton(); 
    } 

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

Cette version ne sera pas créer une instance du singleton jusqu'à ce que vous accédez getInstance(), mais en raison de la façon dont la machine virtuelle Java/classloader gère la création sur la classe interne, vous êtes garanti que le constructeur ne soit appelé qu'une seule fois.

+1

Explication: Je ne pense pas qu'il n'y a aucun moyen de restreindre l'exécution de constructeur. La solution est de: rendre le constructeur privé - de sorte que personne ne puisse l'invoquer de l'extérieur. Utilisez une fonction statique pour initialiser la seule instance d'objet - si elle est NULL, appelez le constructeur en interne. – effkay

+0

La seule amélioration que je ferais à ceci est l'initialisation paresseuse du singleton. –

+1

Pourquoi le bloc statique? Vous pouvez simplement init l'instance sur la même ligne où vous l'avez déclarée. @Taylor L Vous n'avez pas toujours besoin d'init paresseux, cela dépend du reste de l'application et de ses exigences d'amorçage. –

1
In Java, how can we have one instance of the BrokerPacket class in two threads? 

Pour que toutes les mises à jour stockent les différents BrokerLocation dans un tableau d'emplacement. Par exemple:

class BrokerLocation implements Serializable { 
    public String broker_host; 
    public Integer broker_port; 

    /* constructor */ 
    public BrokerLocation(String host, Integer port) { 
     this.broker_host = host; 
     this.broker_port = port; 
    } 
} 


public class BrokerPacket implements Serializable { 
    public static BrokerLocation locations[]; 

} 
Questions connexes