Mein erster Blogeintrag

Moin, habe heute meinen ersten Blogeintrag verfasst zum Thema “Checked Exceptions funktional ignorieren”. Zu finden unter:
http://forum.byte-welt.net/entries/51-Geworfene-checked-Exceptions-funktional-ignorieren
Weil’s mein erster ist, mache ich dafür mal Werbung. Vielleicht findet es jemand nützlich. Kommentare sind willkommen.

Ist leider nix da… jaja die Werbung bescheisst immer

Danke für den Hinweis. Hmm, wenn ich ausgeloggt bin, sehe ich ihn auch garnicht. Wenn ich eingeloggt bin, sehe ich ihn (wahrscheinlich, weil’s meiner ist). Auch in der Übersicht der Blogeinträge wird er angezeigt. Werde mich mal mit den Einstellungen beschäftigen…

Edit: Ich Depp, man muss ihn natürlich auch „veröffentlichen“! :wut:

Gut, ich muss zugeben : ich bin beeindruckt was für teilweise recht abenteuerliche Konstrukte man zusammenbasteln kann … aber ich verstehs leider überhaupt gar nicht.

Soweit wie ich es mir zusammenbauen kann :
Man implementiert das Interface womit die eigene Klasse ebenfalls zum Type ExceptionThrower wird und man die Methode execute() implementieren muss.
Was ich jetzt nicht verstehe : Warum wird nicht this sondern eine Methoden-Referenz (ich hab zwar schon viel mit Reflections gespielt, aber die Dinger verstehe ich leider auch nicht) übergeben und wie dann ohne Implementierung der execute()-Methode die übergebene Methode gecallt wird ?

Im englischen würde man dazu “mind blown” sagen.
Ich hab mich mit den neuen Features in Java8 noch nicht auseinander gesetzt, aber das man ein Interface implementieren kann ohne eine Implementierung für die darin beschriebenen Methoden zu liefern lässt mich dran zweifeln ob ich Interfaces jemals ganz korrekt verstanden habe.

Wäre nett wenn mir jemand dazu mal was linken könnte wo das halbwegs verständlich erklärt wird.

Ich habe mich mit Java 8 bisher noch gar nicht auseinandergesetzt, aber das errinnert mich jetzt gewaltig an JavaScript. Einer Funktion eine Funktion übergeben, einfach so - na wenigstens braucht man noch eine Annotation um sowas anzuzeigen :smiley:

[quote=Sen-Mithrarin]Soweit wie ich es mir zusammenbauen kann :
Man implementiert das Interface womit die eigene Klasse ebenfalls zum Type ExceptionThrower wird und man die Methode execute() implementieren muss.[/quote]
Nein, der Witz ist, dass man genau das mit Functional Interfaces nicht mehr muss! Jede Methode (egal ob static oder Instanz-), deren Signatur zur funktionalen Methode des Interfaces kompatibel ist, ist automatisch eine Implementierung dieses Interfaces.

Der Vorteil in dem von mir vorgestellten Fall: In allen Fällen hat man einen ähnlichen try-catch-Block, den man aber mangels gemeinsamen Ober-Interfaces von z.B. Closeable und NamingEnumeration nicht in eine generalisierte Methode auslagern kann. Ergo: Mit nicht-funktionalem Java hat man Codeduplizierung. Mit den funktionalen Features von Java 8 hat man jetzt einen Weg, wo man das gemeinsame Verhalten trotz unterschiedlichster Klassen/Interfaces doch generalisieren kann.

Naja, durch aus logisch, aber ich steig leider trotzdem nicht durch wie aus dem call execute() dann die entsprechende Methode (in dem Fall close()) gecallt wird und wie halt der Parameter (der ja, zumindest soweit ich das verstehe, eine Art “Method”-Type ist) zum Interface-Type der Signatur wird. Ich kann mich ja gerne mit der Erklärung anfreunden : “ja is halt so”, aber trotzdem bin ich dann nicht in der Lage vergleichbares zu reproduzieren. Denn für gewisse Dinge siehts auf jeden Fall sehr interessant aus, genau wie auch default-Methoden und der gleichen.
Wie gesagt : ich bin echt ein Freund von Interfaces (und bau auch gerne mal einfache Dinge unnötig kompliziert) und hab auch viel mit Reflections gespielt, aber beides irgendwie zusammen … das will mir nicht in den Kopf. Bitte daher um Aufklärung …

Das hat gar nichts mit Reflection zu tun… Das ist eine Methodenreferenz, die da übergeben wird. Man kann das Argument als eine Art anonyme innere Klasse auffassen, dessen einzige Methode durch die Referenz angegeben ist. Dabei spielt der Name der Methode, die übergeben wird, keine Rolle, weil das funktionale Interface nur genau eine nicht implementierte Methode hat. Daher reicht es aus, dass die Parameter der Methode identisch sind (in diesem Fall nämlich keine Parameter). Die Methode wird dann von der statischen Methode printStackTraceIfThrows unter dem Namen execute, welcher im Interface definiert ist, aufgerufen.