2011-01-13 5 views
1

Mögliche Duplizieren:
What's the nearest substitute for a function pointer in Java?Was ist die Schlussfolgerung zu einem Funktionszeiger in Java?

Ich habe nur eine Situation, wo es schön wäre, um die Funktionalität von etwas zu haben ähnlichen Zeiger funktionieren, wie Sie in C oder C++ verwenden können. Das Beste, was ich mir vorstellen kann, ist, Runnables zu kombinieren und sie in einem anderen Thread zu starten. Vorschläge?

+2

dupe?http://StackOverflow.com/Questions/1073358/Function-Pointers-in-Java – spacemanaki

+0

Oder dupe davon: http://StackOverflow.com/Questions/2186931/Java-Pass-Method-AS-Parameter – sleske

Antwort

8

Bis sie Schließungen zu Java hinzufügen, scheint die Sache java.lang.reflect.Method am nächsten zu sein. Zum Beispiel Method method = SomeClass.getMethod("methodName", methodParameterTypes)

Dann können Sie die method um passieren (wie ein Funktionszeiger) und rufen invoke(..) auf sich, vorbei an ein Objekt (oder null wenn statisch)

Aber dies ist nicht eine recht gute Praxis. Sie können eine Schnittstelle definieren oder eine vorhandene Runnable/Callable verwenden, sie inline implementieren und die Instanz übergeben.

+0

Das sollte sein fähig, den Job zu bewältigen. Vielen Dank! – user489041

0

Callbacks sind eine Möglichkeit, etwas Ähnliches zu implementieren, was Sie mit einem Funktionszeiger in C++ tun.
Zusätzlich sind sie typsicher (anders als Funktionszeiger, die nicht sein könnten).

2

Sie könnten nach der command pattern suchen, die im Wesentlichen eine Schnittstelle mit einer Methode definiert (zB execute()) und Klassen, die diese Methode für verschiedene Aktionen implementieren. Sie können Verweise auf Instanzen dieser Klassen wie Funktionszeiger in C++ verwenden. Dieses Muster wird häufig verwendet, um Interpreter zu implementieren.

2

Eine Option verwendet java.lang.reflect.Method, wie in Bozho Antworten erläutert. Es ist sehr flexibel, aber die Hauptnachteile sind, dass Sie die Sicherheit aller Typen verlieren - es gibt keine Überprüfung, dass Sie die Methode mit den richtigen Parametern aufrufen (und den richtigen Rückgabetyp erwarten).

Also, wenn Sie später die Methode ändern und vergessen, alle Anrufer zu ändern, werden Sie nur zur Laufzeit (durch eine ClassCastException) herausfinden. Auch der Methodenname wird nur zur Laufzeit geprüft (weil Sie ihn namentlich holen.

Alternativ können Callbacks über Schnittstellen verwendet werden. Eine Methode, die eine andere Methode als Parameter akzeptieren will, erwartet nur eine Instanz einer bestimmten Schnittstelle. Die Schnittstelle hat nur eine Methode, doStuff.So können Sie Instanzen erstellen, die die Schnittstelle implementieren, und diese an die Methoden übergeben.Das ist ein wenig ausführlicher (weil Sie die Schnittstelle benötigen), aber typsicher und somit einfacher zu refactor.Nachricht

Das ist mehr oder weniger die command pattern, BTW.

+0

Ist es wirklich das Befehlsmuster? Ich denke, es kommt der Strategie näher. – helpermethod

+1

Ja, könnte gut sein. Ich denke beide sind ziemlich ähnlich, und auf jeden Fall würden beide wahrscheinlich ähnlich in Java implementiert werden. – sleske

3

Verwenden Sie Functors, aka Function Objects.

Java hat keine erstklassigen Funktionen, so Funktionsobjekte werden in der Regel mit einem einzigen Verfahren durch eine Schnittstelle ausgedrückt (üblicherweise für den aufrufbare Schnittstelle), typischerweise mit der Implementierung eine anonyme innere Klasse ist .

Verwandte Themen