6
votes

Instancez l'objet singleton en utilisant la classe.forname ()?

Je veux instancier une instance d'une classe de la chaîne Nom de la classe. (en utilisant la classe.forname (). NewInstance ().)

Voici le problème: je veux que ce cas soit un singleton .. Je pourrais faire cela en utilisant un modèle singleton, sauf que NewInstance appelle le constructeur par défaut pour une classe, et avec un singleton, ce constructeur doit être "privé" ..

Y a-t-il une solution? Je pourrais penser à une manière moins élégante Pour ce faire (en utilisant un hashmap comme une table de recherche ..), mais préféreriez une meilleure solution ..

merci,


2 commentaires

Je viens de lire si votre question deux fois et je ne le suis pas suivi ... Peut-être que d'autres vont, mais je pensais que je vous ferais savoir ...


FYI: développeurs.sun.com/learning/javaoneonline/2008/ PDF / TS-6623.P DF Page 31.


5 Réponses :


1
votes

Vous pouvez utiliser une énumération et avoir un haschmap nommé pour chacun d'eux. Ou vous pouvez utiliser un cadre d'injection de dépendance pour obtenir un singleton de quelque chose (Guice?)

Modifier d'accord, je saute avec un échantillon de code aussi: xxx

et son coffre-fort et son son. éditer et a une signification maintenant.


0 commentaires

8
votes

Un classique singleton a également une méthode statique getinstance () - appeler cela par réflexion au lieu d'utiliser NewInstance (). Oui, c'est plus de travail, mais c'est comme ça que c'est ...

ou vous pouvez utiliser SETSPESSIBLE () pour appeler le constructeur privé de toute façon, mais vous briseriez le singleton et aller en enfer.

Troisièmement, vous pouvez éviter d'avoir un singleton tout à fait et à trouver une meilleure exposition (il y a généralement).


0 commentaires

8
votes

Vous pouvez utiliser la réflexion pour obtenir une référence à une méthode d'usine statique de la classe, puis invoquez cela. La méthode d'usine pourrait appliquer le modèle singleton xxx pré>

p>

public class MyClass {

   private static MyClass instance;

   private MyClass() { 
      // private c'tor 
   }

   public static synchronized MyClass getInstance() {
      if (instance == null) {
         instance = new MyClass();
      }
      return instance:
   }
}


2 commentaires

Nice, j'aimerais toujours savoir pourquoi l'OP veut avoir un singleton par son nom?


Peut-être qu'ils réinventent le printemps.



2
votes

Vous devrez connaître le nom de la méthode de votre classe Singleton qui construit l'objet. Si c'est E.G. appelé "instance ()", vous pouvez faire quelque chose comme xxx


0 commentaires

0
votes

Pouvez-vous plutôt compter sur l'existence d'une méthode d'usine statique? Cela dépendrait d'une certaine mesure de la convention de dénomination, mais cela fonctionnerait.

Bottom Line: Si une classe doit être connue pour être singleton, il doit avoir la responsabilité de ce maintien de la police. Par conséquent, il doit être conforme à une implémentation du motif, et si vous souhaitez une sélection dynamique parmi de telles classes, vous devez pouvoir prédire l'approche "usine".


0 commentaires