Wenn ich in Python einige Funktionen habe, die ich basierend auf einer Eingabe aufrufen möchte, kann ich dies tun:
%Vor%Das heißt, ich habe ein Wörterbuch des Funktionsnamens, das der Funktion zugeordnet ist, und rufe die Funktion durch eine Wörterbuchsuche auf.
Wie macht man das in Java?
Es gibt mehrere Möglichkeiten, dieses Problem anzugehen. Die meisten davon wurden bereits gepostet:
Ich persönlich würde den Befehl Ansatz verwenden. Befehle lassen sich gut mit Vorlagenmethoden kombinieren, sodass Sie bestimmte Muster für alle Ihre Befehlsobjekte erzwingen können. Beispiel:
%Vor%Ich würde nur auf Reflektion zurückgreifen, wenn Sie diese Art von Mapping für Klassen verwenden müssen, deren Design Sie nicht steuern und für die es nicht praktisch ist, Befehle zu erstellen. Beispielsweise könnten Sie die Java-API nicht in einer Befehls-Shell verfügbar machen, indem Sie für jede Methode Befehle erstellen.
Java hat keine erstklassigen Methoden, daher ist das Befehlsmuster Ihr Freund ...
>disclamer: Code nicht getestet!
%Vor%Sie könnten eine Map & lt; String, Methode & gt; oder Map & lt; String, Callable & gt; usw., und verwenden Sie dann map.get ("function1"). invoke (...). Aber normalerweise werden solche Probleme sauberer behandelt, indem Polymorphie anstelle von Nachschlagen verwendet wird.
Wie in anderen Fragen erwähnt, ist ein Map<String,MyCommandType>
mit anonymen inneren Klassen eine ausführliche Möglichkeit, dies zu tun.
Eine Variante besteht darin, anstelle der anonymen inneren Klassen enums zu verwenden. Jede Konstante der Enumeration kann Methoden der Enumeration oder der implementierten Schnittstelle implementieren / überschreiben, ähnlich wie die anonyme innere Klassen-Technik, aber mit ein wenig weniger Unordnung. Ich glaube, Effective Java 2nd Ed beschäftigt sich damit, wie man eine Karte von Enums initialisiert. Um aus dem Enum-Namen zu mappen, muss lediglich MyEnumType.valueOf(name)
aufgerufen werden.
Wie alle anderen sagten, unterstützt Java keine Funktionen als Objekte der ersten Ebene. Um dies zu erreichen, verwenden Sie einen Functor, eine Klasse, die eine Funktion umschließt. Steve Yegge hat eine schöne Tirade darüber.
>
Um Ihnen bei dieser Einschränkung zu helfen, schreiben Leute Funktor-Bibliotheken: jga , Commons Functor
Leider hat Java keine erstklassigen Funktionen, aber betrachten Sie die folgende Schnittstelle:
%Vor% Dies modelliert den Typ für Funktionen vom Typ A
bis zum Typ B
als erstklassige Werte, die Sie weitergeben können. Was Sie wollen, ist ein Map<String, F<A, B>>
.
Functional Java ist eine ziemlich vollständige Bibliothek mit erstklassigen Funktionen.