Comment puis-je associer une Chaîne à une fonction en Java?

Actuellement, j'ai un tas de classes Java qui implémentent une Processor de l'interface, ce qui signifie qu'ils ont tous un processRequest(String key) méthode. L'idée est que chaque classe a un peu (disons, <10) membre Strings, et chacune de ces cartes à une méthode de la classe via le processRequest méthode, comme suit:

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...
}

Vous obtenez l'idée.

Cela fonctionnait très bien pour moi, mais maintenant j'ai besoin de l'exécution, accessible cartographie de la clé de fonction; pas chaque fonction fait retourne une Chaîne de caractères (un peu de retour void) et j'ai besoin d'accéder dynamiquement le type de retour (à l'aide de la réflexion) de chaque fonction dans chaque catégorie, il y a une clé pour. J'ai déjà un gestionnaire qui connaît toutes les clés, mais pas la cartographie de touche de fonction.

Mon premier instinct a été de remplacer cette cartographie à l'aide de if-else états Map<String, Function>, comme j'ai pu le faire en Javascript. Mais, Java n'a pas de soutien de première classe de fonctions, donc je suis hors de la chance. Je pourrais sans doute creuser jusqu'à un tiers de bibliothèque qui me permet de travailler avec des fonctions de classe, mais je n'ai pas vu encore, et je doute que j'ai besoin d'une toute nouvelle bibliothèque.

J'ai aussi pensé à mettre ces String clés dans un tableau et en utilisant la réflexion d'appeler les méthodes par son nom, mais je vois deux inconvénients à cette méthode:

  • Mes clés devrait être le même nom que la méthode ou à être nommé dans un particulier, de manière cohérente, de sorte qu'il est facile de les mapper sur le nom de la méthode.
  • Cela semble beaucoup plus lent que la if-else déclarations que j'ai droit. L'efficacité est quelque chose de préoccupant, parce que ces méthodes ont tendance à être appelé assez souvent, et je veux limiter les frais généraux.

TL; DR: je suis à la recherche d'un endroit propre, à peu de frais généraux pour cartographier un String à une sorte de Function objet que je peux appeler et appeler (quelque chose comme) getReturnType(). Je n'ai pas particulièrement l'esprit à l'aide d'un 3e partie de la bibliothèque si elle vraiment correspond à mes besoins. Je n'ai pas l'esprit à l'aide de la réflexion, je préfère éviter d'utiliser la réflexion à chaque fois que je fais une méthode de recherche - peut-être à l'aide de certains de la mise en cache de la stratégie qui combine les Map avec la réflexion.

Pensées sur une bonne voie pour obtenir ce que je veux? Cheers!

Ne pourriez-vous pas faire de Chaîne à la Méthode (java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/Method.html)? Ensuite, vous pouvez mettre en cache les méthodes que vous devez exécuter.
ouais, c'est typiquement l'endroit où j'étais à la tête à la fin de ma question.
Fait 🙂 🙂 🙂

OriginalL'auteur Matt Ball | 2010-04-30