Funktionszeiger in Java
Dies kann etwas, das Häufig und trivial, aber ich scheine Schwierigkeiten zu haben, eine konkrete Antwort. In C# gibt es ein Konzept der Delegierten, die sich stark an der Idee der Funktionszeiger aus C++. Gibt es eine ähnliche Funktionalität in Java? Gegeben, die Zeiger sind etwas abwesend, was ist der beste Weg dazu? Und klar, wir reden hier von der ersten Klasse hier.
InformationsquelleAutor der Frage Ben Lakey | 2009-07-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Java-idiom zur Funktions-Zeiger-Funktionen ist eine anonyme Klasse implementieren eine Schnittstelle, z.B.
Update: die oben notwendig ist, in Java-Versionen vor Java 8. Jetzt haben wir viel schönere alternativen, nämlich lambdas:
und Methode Referenzen:
InformationsquelleAutor der Antwort Michael Borgwardt
Können Sie substitue eine Funktion Zeiger mit einer Schnittstelle. Können sagen, Sie wollen zu laufen, durch eine Sammlung und tun Sie etwas mit jedem element.
Dies ist die Schnittstelle, die wir weitergeben konnten einige sagen CollectionUtils2.doFunc(Collection c, IFunction f).
Als ein Beispiel, sagen wir, wir haben eine Sammlung von zahlen, und Sie möchten, fügen Sie 1 zu jedem element.
InformationsquelleAutor der Antwort raupach
Können Sie mithilfe von reflektion, es zu tun.
Übergeben als parameter das Objekt und die Methode name (als string) und dann die Methode aufrufen. Zum Beispiel:
Und dann verwenden Sie es als:
Natürlich, überprüfen Sie alle Ausnahmen, und fügen Sie die benötigten wirft.
InformationsquelleAutor der Antwort zoquete
Nein, Funktionen sind keine first-class-Objekte in java. Sie können das gleiche tun, durch die Implementierung einer handler - Klasse-das ist wie callbacks implementiert werden, die in der Swing etc.
Gibt es jedoch Vorschläge für die Verschlüsse (der offizielle name für das, was Sie reden) in zukünftigen Versionen von java - Javaworld hat einen interessanten Artikel.
InformationsquelleAutor der Antwort jwoolard
Dieser erinnert an Steve Yegge ' s Die Ausführung in das Reich der Substantive. Es ist im Grunde besagt, dass Java benötigt ein Objekt für jede Aktion, und daher nicht "verb-only" - Personen wie Funktionszeiger.
InformationsquelleAutor der Antwort Yuval F
Erreichen ähnlicher Funktionalität, die Sie konnte Verwendung von anonymen inneren Klassen.
Wenn Sie definieren eine Schnittstelle
Foo
:Erstellen Sie eine Methode
bar
die erhalten ein 'Funktionszeiger' als argument:Schließlich rufen Sie die Methode wie folgt:
InformationsquelleAutor der Antwort Kingamajick
Gibt es keine solche Sache in Java. Sie müssen wickeln Sie Ihre Funktion in ein Objekt, und übergeben Sie die Referenz auf das Objekt, um übergeben Sie die Referenz auf die Methode auf das Objekt.
Syntaktisch, dies kann erleichtert werden, zu einem gewissen Grad durch anonyme Klassen definiert, die in-place-oder anonyme Klassen definiert, die als member-Variablen der Klasse.
Beispiel:
InformationsquelleAutor der Antwort VoidPointer
Java8 eingeführt hat, lambdas und Methode Referenzen. Also, wenn Sie Ihre Funktion entspricht einem funktionale Schnittstelle (Sie können Ihre eigenen erstellen) können Sie eine Methode verweisen in diesem Fall.
Java bietet eine Reihe von gemeinsame funktionale Schnittstellen. in der Erwägung, dass können Sie das folgende tun:
InformationsquelleAutor der Antwort Alex
Habe ich implementiert callback-Delegaten-Unterstützung in Java unter Verwendung von reflektion ab. Details und die Arbeit die Quelle finden Sie auf meiner website.
Wie Es Funktioniert
Wir haben ein Prinzip-Klasse mit Rückruf mit einer geschachtelten Klasse mit dem Namen WithParms. Die API, die Bedürfnisse der Rückruf nehmen Sie ein Callback-Objekt als parameter und, falls nötig, erstellen Sie einen Rückruf.WithParms als Methode variable. Da eine Vielzahl der Anwendungen, die dieses Objekt wird rekursiv sein, das funktioniert auch sehr sauber.
Mit der Leistung immer noch eine hohe Priorität für mich, ich wollte nicht gefordert werden, erstellen Sie eine Wegwerf-object-array zum speichern der Parameter für jedes Aufruf - nachdem alle in einer großen Datenstruktur, könnte es Tausende von Elementen, und in einer message-Verarbeitung-Szenario konnten wir am Ende der Verarbeitung Tausende von Daten Strukturen eine Sekunde.
Um threadsicher sind die parameter-array muss es eindeutig für jeden Aufruf der API-Methode und für die Effizienz die gleiche, die sollte verwendet werden, für jeden Aufruf der callback; ich brauchte ein zweites Objekt, das wäre Billig zu erstellen, um zu binden, callback mit einem parameter-array für den Aufruf. Aber in einigen Szenarien, die invoker würde bereits ein parameter-array aus anderen Gründen. Für diese beiden Gründe, die parameter-array gehören nicht in das Callback-Objekt. Auch die Wahl der Aufruf (übergabe der Parameter als array oder als einzelne Objekte) gehört in die Hände der API mit callback ermöglicht es, welchen Aufruf Sie am besten geeignet ist es das Innenleben.
Den WithParms geschachtelte Klasse ist optional und dient zwei Zwecken, es enthält die parameter Objekt-array benötigt für die callback-Aufrufe, und es bietet 10 überlastet invoke() Methoden (mit von 1 bis 10 Parameter) laden des parameter-array und ruft dann die callback-Ziel.
InformationsquelleAutor der Antwort Lawrence Dol
Überprüfen die Verschlüsse, wie Sie umgesetzt wurden in der lambdaj Bibliothek. Sie haben tatsächlich ein Verhalten sehr ähnlich zu C# - Delegaten:
http://code.google.com/p/lambdaj/wiki/Closures
InformationsquelleAutor der Antwort Mario Fusco
Relativ zu den meisten Menschen hier, ich bin neu in java, aber da habe ich nicht gesehen, einen ähnlichen Vorschlag habe ich eine andere alternative vorschlagen. Ich bin nicht sicher, ob es eine gute Praxis, oder nicht, oder schlug sogar vor, und ich einfach nicht bekommen es. Ich mag es einfach da ich denke, dass seine selbst-beschreibend.
dann je nach Anwendung zuweisen
etc.
- und call-by -
InformationsquelleAutor der Antwort Özgen Eren