Java-Äquivalent der Funktionszuordnung in Python

7

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?

    
Ross 01.06.2009, 11:48
quelle

7 Antworten

3

Es gibt mehrere Möglichkeiten, dieses Problem anzugehen. Die meisten davon wurden bereits gepostet:

  • Befehle - Behalten Sie eine Reihe von Objekten mit einem Methode execute () oder invoke () in einer Map; Suchen Sie den Befehl nach dem Namen und rufen Sie dann die Methode auf.
  • Polymorphism - Allgemeiner als Befehle, die Sie aufrufen können Methoden für alle verwandten Objekte.
  • Endlich gibt es Reflection - Sie können reflection verwenden, um Verweise auf java.lang.Method-Objekte zu erhalten. Für eine Menge bekannter Klassen / Methoden funktioniert das ziemlich gut und es gibt nicht zu viel Aufwand, sobald Sie die Methodenobjekte geladen haben. Damit können Sie beispielsweise einem Benutzer Java-Code in eine Befehlszeile eingeben, die Sie in Echtzeit ausführen.

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.

    
Mr. Shiny and New 安宇 01.06.2009, 13:35
quelle
14

Java hat keine erstklassigen Methoden, daher ist das Befehlsmuster Ihr Freund ...

>

disclamer: Code nicht getestet!

%Vor%     
Dan Vinton 01.06.2009 11:58
quelle
2

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.

    
Roland Ewald 01.06.2009 11:52
quelle
1

Polymorphes Beispiel ..

%Vor%     
rich 01.06.2009 12:45
quelle
0

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.

    
Tom Hawtin - tackline 01.06.2009 14:30
quelle
0

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

    
ykaganovich 01.06.2009 18:33
quelle
0

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.

    
Apocalisp 01.06.2009 17:13
quelle

Tags und Links