| 

.NET C# Java Javascript Exception

4
In .NET gibt es bekanntlich das Action-Delegate, welches ganz abstrakt das Konzept "etwas, das ich ohne Parameter und ohne Rückgabewert aufrufen kann" repräsentiert. So etwas suche ich für Java - nach Möglichkeit im Rahmen der Java SE, notfalls auch in einer freien Bibliothek.

Java kennt natürlich keine Delegates, stattdessen verwendet man dort Interfaces mit genau einer Methode. Ein Interface, das von der Syntax her das bietet, was ich mir vorstelle, ist Runnable. Mich stört aber, dass es von der Semantik her mit "wird irgendwann in einem (anderen) Thread ausgeführt" verbunden ist. Das finde ich beim Lesen von Code verwirrend. (Und die Frage kam für mich genau deshalb auf, weil ich in fremdem Code auf eine Verwendung von Runnable für einen Callback gestoßen bin, der synchron aufgerufen wurde, was ich aber erst nicht bemerkt habe - eben weil ich bei Runnable sofort an einen asynchronen Aufruf in einem anderen Thread gedacht habe.) Gibt es irgendwo in Java noch ein ähnliches Interface, das ebenso allgemein gehalten, aber eben nicht mit der Thread-Semantik aufgeladen ist? Oder ist es tatsächlich allgemeine Praxis, synchron aufzurufende Callbacks (für die sich nicht ein spezialisierteres Interface anbietet) als Runnable darzustellen?
12.10.2011
Matthias Hlawatsch 13,2k 4 9
3 Antworten
2
Hi Matthias,

zu gängiger Praxis kann ich nichts sagen, hab ewig schon kein Java mehr gemacht.

Aber mal so ganz pragmatisch: Spricht was gegen ein selbst definiertes Interface, statt Runnable zu verwenden? Was steckt hinter der Frage nach einer freien Bibliothek, die ein solches enthält? Das hast Du doch schnell selbst gemacht?!?

Hab mir eben auch noch kurz die Doku zu Runnable angesehen und die ist tatsächlich von der ersten Zeile an mit Hinweisen zu asynchroner Ausführung gespickt. Daher würde ich wie Du dazu tendieren, dieses Interface auch in diesem Kontext zu belassen und nicht für synchrone "Actions" zu verwenden.

Das war jetzt eigentlich eher eine persönliche Meinung als eine Antwort, aber vielleicht hilfts Dir trotzdem weiter.

Viel Erfolg
Florian
12.10.2011
ffordermaier 8,4k 3 9
1
Klar, ein selbst definiertes Interface wäre eine Lösung. Aber dann muss der Leser des Codes erst wieder nachschauen, was das ist. Dokumentieren muss ich es auch, es passt inhaltlich, weil sehr allgemein, nicht in eines der vorhandenen Packages... Sowas grundlegendes würde ich gerne einfach nur nutzen, statt zigmal das Rad neu zu erfinden.
Die Frage nach der Bibliothek: ich würde sicher allein dafür nichts neues zum Projekt hinzufügen, aber evtl. haben wir es ja unbemerkt schon im Einsatz. Und manchmal ist das ja auch ein Hinweis darauf, dass sich das Suchen in der Java SE nicht lohnt...
Matthias Hlawatsch 12.10.2011
Ok, verstehe. Habt Ihr keine eigene projektübergreifende Infrastruktur-Library, die intern Produktcharakter hat, d.h. mit eigenem Lebenszyklus? Da würde das gut hineinpassen.

"Aber dann muss der Leser des Codes erst wieder nachschauen, was das ist." - auch da geb ich Dir Recht, aber am Doku lesen kommt man nicht vorbei, wenn man ein Interface nicht kennt; und wer sagt, dass das Interface, das evtl. schon in einer Bibliothek enthalten ist, allen beteiligten Entwicklern bekannt ist (wäre Zufall, oder)?
ffordermaier 12.10.2011
1
Ich glaube nicht dass es etwas gibt das dem genau entspricht was du suchst. Hier findest du eine entsprechende Diskussion auf Stackoverflow. In Spring gibt's den MethodInvoker wobei ich nicht weiß ob ihr das einsetzt. Im Zweifelsfall lieber ordentlich selbst implementieren, wie Florian bereits vorgeschlagen hat.
Gruß
Daniel
12.10.2011
puls200 3,8k 7
Sorry für die späte Rückmeldung. Spring haben wir im Einsatz, MethodInvoker ist von der Idee her auch gar nicht so schlecht, aber mich stört, dass ich dann eine Abhängigkeit zu einer Klasse statt einem Interface habe und dass hier wahrscheinlich Reflection im Hintergrund werkelt.
SO verweist u.a. auf Google Guava, die immerhin ein Function<I,O>-Interface haben, aber leider keine Action. Ansonsten finden interessanterweise auch 5 SO-User die Runnable-Version gut (oder sogar mehr, falls es negative Votes gegeben haben sollte).
Matthias Hlawatsch 18.10.2011
0
Ich würde im Swing-Umfeld ActionListener mit der Methode "actionPerformed" sehen.

Ansonsten eigenes Interface.

MethodInvoker hört sich stark nach Reflection an, was man grundsätzlich in Frage stellen sollte. Reflection hat im regulärem Code nichts zu suchen. --> Transparenz

Ich würde auch nicht in anderen Bibliotheken nach solchen Interfaces suchen, weil man sonst die Anwendung von der Bibliothek abhängig macht --> Böse Falle. Eigenes Interface --> glücklich sein.
15.11.2011
oopexpert 455 1 8

Stelle deine Java-Frage jetzt!