Actuellement, j'ai une bande de classes Java qui implémentent une interface code> processeur code>, ce qui signifie qu'ils ont tous un processRequest (clé de chaîne) code> méthode. L'idée est que chaque classe a quelques membres (disons, code> et chacune de ces cartes vers une méthode de la classe via la méthode code> ProcessRequest Code> :
class FooProcessor implements Processor
{
String key1 = "abc";
String key2 = "def";
String key3 = "ghi";
// and so on...
String processRequest(String key)
{
String toReturn = null;
if (key1.equals(key)) toReturn = method1();
else if (key2.equals(key)) toReturn = method2();
else if (key3.equals(key)) toReturn = method3();
// and so on...
return toReturn;
}
String method1() { // do stuff }
String method2() { // do other stuff }
String method3() { // do other other stuff }
// and so on...
}
7 Réponses :
Comme vous l'avez remarqué, vous pouvez faire ce que vous voulez utiliser l'utilisation du API de réflexion , mais vous perdez des avantages du compilateur Java, en plus des problèmes que vous avez déjà proposés. Enroulions vos chaînes dans un objet et en utilisant le Modèle de visiteur résoudre votre problème? Chaque StringWrapper code> n'accepterait que un visiteur code> code> qui a la bonne méthode, ou quelque chose le long de ces lignes. P>
Je ne pense pas que le modèle de visiteur est la bonne approche ici - c'est-à-dire que je ne suis pas vendu dessus. Qu'est-ce que le visiteur code> fonctionne? Quelle serait l'opération?
@Bears va vous manger - comme je pensais à cette idée, j'ai imaginé le visiteur visitant une enveloppe pour chaque chaîne, mais à nouveau, il semble que vous ne savez pas quelle chaîne apparaîtra lorsque. Je pense que l'idée d'interface est beaucoup plus simple.
Visiteur? Utilisez le modèle de commande ou de stratégie. Les autres réponses démontrent le modèle de commande. Vous pouvez trouver des exemples réels de la vie de motifs ici afin que vous puissiez apprendre un peu plus sur eux.
Il n'y a aucune fonction autonome de première classe, mais vous pouvez faire ce que vous voulez avec une interface. Créez une interface qui représente votre fonction. Par exemple, vous pouvez avoir les éléments suivants: alors vous pouvez créer une carte carte
Cela signifierait avoir une classe d'implémentation pour chaque fonction que je souhaite appeler, qui semble clunky et nécessite un peu de chaudière pour chaque fonction. Ne sonne pas ça génial pour moi.
C'est totalement clunky, mais c'est la faute de Java pour ne pas soutenir directement les fonctions d'ordre supérieur.
@Bears, oui c'est clunky, mais vous pouvez construire des cours anonymes, ce qui devrait le rendre quelque peu maladroit, comme Carte.put (Str, New Computerstring () {String publique Invoke () {Retour "Blah";}});
Bien que vous ne puissiez pas avoir de fonctions de première classe, il existe des classes anonymes qui peuvent être basées sur une interface: ou vous pouvez utiliser scala: -) p> p>
Utilisez une carte où la clé est une chaîne et la valeur est un objet qui implémente une interface contenant une méthode (). De cette façon, vous pouvez obtenir l'objet contenant la méthode que vous souhaitez sortir de la carte. Ensuite, appelez cette méthode sur l'objet. Par exemple:
ne pouviez-vous pas faire string code> à
méthode code> ? Ensuite, vous pouvez mettre en cache les méthodes dont vous avez besoin pour exécuter. P>
Ne pouviez-vous pas faire de chaîne à la méthode ( Java.sun.com/j2se/1.4.2/docs/aplect/java/lang/reflect/Method.h tml )? Ensuite, vous pouvez mettre en cache les méthodes dont vous avez besoin pour exécuter.
@Chris - Ouais, c'est essentiellement où je me dirigeais à la fin de ma question.