En passant un nom de classe comme paramètre
J'ai 3 classes de RedAlert
, YellowAlert
, et BlueAlert
.
Dans ma classe AlertController
je veux avoir une méthode comme ceci:
public void SetAlert(//TAKE IN NAME OF CLASS HERE//)
{
CLASSNAME anInstance = new CLASSNAME();
}
Ainsi, par exemple, je veux:
AlertController aController = new AlertController();
SetAlert(RedAlert);
Comment prenez-vous le nom de la classe en tant que paramètre, et basé sur un nom de classe créer l'objet approprié dans le nom de la classe?
Vous avez besoin de regarder dans la Réflexion Java API , Class !
Mais pourquoi avez-vous envie? Quel est le problème avec
Mais pourquoi avez-vous envie? Quel est le problème avec
SetAlert(new RedAlert())
?OriginalL'auteur 1110101001 | 2013-07-25
Vous devez vous connecter pour publier un commentaire.
L'aide de la réflexion, c'est possible. Ici pour une classe (passe comme une chaîne de caractères) . Cette classe sera recherché dans la mémoire ( elle devrait être déjà chargé). Le nom de la classe à être instanciée lorsqu'il est passé comme une chaîne de caractères doivent être qualifiés
OriginalL'auteur Sanyam Goel
Au lieu de passer le nom de la classe, vous pouvez passer à la classe elle-même et utiliser la réflexion pour créer une nouvelle instance de la classe. Voici un exemple de base (en supposant que tous vos
XxxAlert
classes étendre à partir d'unAlert
classe):Maintenant vous suffit d'appeler la méthode comme ceci:
Note qu'il serait mieux à l'aide d'une super classe dans
T
paramètre, sinon vous (ou un autre programmeur) pourrait faire ceci:qui serait simplement faux.
Pour la plupart des situations, c'est mieux que la accepté de répondre.
OriginalL'auteur Luiggi Mendoza
Pourquoi ne pas utiliser un modèle de fabrique approche.
Alors vous pourriez faire quelque chose comme cela.
Il est possible d'utiliser votre approche à l'aide de java.lang.Classe#newInstance.
public abstract class AlertFactory { ... public readonly static RedAlertFactory red = new RedAlertFactory(); ... }
Alors n'ayez pas besoin de créer une nouvelle usine à chaque fois qu'il est utilisé:setAlert(AlertFactory.red)
.OriginalL'auteur raniejade
Alors que vous pouvez créer à l'aide de Réflexion, etc... je vous conseille d'enquêter sur certains Creational les Modèles de Conception.
Spécifiquement le Modèle de Fabrique
Voici une (très) brut exemple:
Et puis, à partir de votre Méthode, vous pouvez utiliser:
De toute façon, tout cela est vraiment laid exemple, je suis en train de mettre en évidence que vous pourriez peut-être regarder la Creational Modèles et résoudre votre problème d'une manière différente sans passer les noms de classe autour de.
equals
au lieu de==
et l'utilisation de la réflexion comme vous l'avez suggéré au début. Sinon, imaginez ce qui se passerait lorsque de nouvellesAlert
sous-classes apparaissent.Je suis totalement d'accord! Il est difficile de savoir exactement ce que les cas d'utilisation sont, dans cet exemple, il suffit de passer dans l'objet instancié.
la réponse est un nettoyeur de conception d'Usine que celle-ci. La réponse ici utilise le non-OO approche de si-test. raniejade utilise des sous-classement de l'usine.
OriginalL'auteur edwardsmatt
Vous pouvez avoir une référence de Classe dans votre signature de la méthode, quelque chose comme ceci:
Ensuite dans votre méthode, vous pouvez créer l'instance de l'entrée de la classe à l'aide de la méthode newInstance:
OriginalL'auteur Juned Ahsan
Ce -
Merci homme.... 🙂
OriginalL'auteur Subhrajyoti Majumder
Éviter les dépendances internes et initialztions:
OriginalL'auteur S.D.
Utiliser les énumérations:
OriginalL'auteur morgano
De nombreuses options:
http://en.wikipedia.org/wiki/Factory_method_pattern
OriginalL'auteur mavarazy
Utiliser Java Réflexion pour créer un objet de la Classe de l'objet. Déclarer votre méthode comme ceci:
Et puis,
OriginalL'auteur Ankur Lathi
C'est la façon de créer une instance à l'aide d'un nom de classe. Le type concret de
Alert
doit avoir un constructeur public qui ne prend pas d'arguments.L'appelant serait de l'utiliser comme ceci:
Si vous créez une convention pour le passage d'un certain nombre de paramètres dans le constructeur, vous pouvez le faire aussi, mais vous aurez besoin de faire un peu de travail supplémentaire dans la
getConstructor()
appel à la trouver. Vous pouvez également utiliser des constructeurs qui ne sont pas publics, mais, encore une fois, qui prend un peu de travail supplémentaire.Les suggestions pour passer à la classe littérale,
RedAlert.class
, ne pas faire beaucoup de sens. Si leRedAlert
classe est disponible à l'appelant au moment de la compilation, vous devriez juste utiliser son constructeur,new RedAlert()
.OriginalL'auteur erickson
Une autre façon que vous pouvez faire cela sans l'aide de la réflexion est d'avoir une Interface dire d'Alerte et d'avoir vos classes - RedAlert, YellowAlert, et BlueAlert en œuvre de l'Alerte de l'interface.
Alors maintenant, votre méthode dans AlertController ressemble:
Maintenant vous pouvez le faire :
OriginalL'auteur Xavier DSouza