{"id":1849,"date":"2013-03-04T11:59:41","date_gmt":"2013-03-04T09:59:41","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=1849"},"modified":"2013-03-04T11:59:41","modified_gmt":"2013-03-04T09:59:41","slug":"klassen-mit-einer-abstrakten-methode-als-funktionale-schnittstelle-in-java-8","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2013\/03\/klassen-mit-einer-abstrakten-methode-als-funktionale-schnittstelle-in-java-8\/","title":{"rendered":"Klassen mit einer abstrakten Methode als funktionale Schnittstelle in Java 8?"},"content":{"rendered":"<p>Als die Entwickler Lambda-Ausdr\u00fccke diskutierten, stand auch die Frage im Raum, ob abstrakte Klassen, die nur \u00fcber eine abstrakte Methode verf\u00fcgen \u2013 fr\u00fcher wurde hier die Abk\u00fcrzung SAM (Single Abstract Method) genutzt \u2013, ebenfalls f\u00fcr Lambda-Ausdr\u00fccke genutzt werden k\u00f6nnen. Sie entschieden sich dagegen, da bei Implementierung von Schnittstellen die JVM weitreichende Optimierungen vornehmen kann. Und bei Klassen wir das schwierig, was auch daran liegt, dass ein Konstruktor umfangreiche Initialisierungen mit Seiteneffekten vornehmen (die Konstruktoren aller Oberklassen nicht zu vergessen) sowie Ausnahmen ausl\u00f6sen k\u00f6nnte. Gew\u00fcnscht ist aber nur die Ausf\u00fchrung einer Implementierung der funktionalen Schnittstelle und kein anderer Code.<\/p>\n<p>Es gibt nun im JDK einige abstrakte Klassen, die genau eine abstrakte Methode vorschreiben, etwa jva.util.TimerTask. Solche Klassen k\u00f6nnen nicht \u00fcber einen Lambda-Ausdruck realisiert werden; hier m\u00fcssen Entwickler weiterhin zu Klassenimplementierungen greifen, und das k\u00fcrzeste ist eine innere anonyme Klasse. Eigene Hilfsklassen k\u00f6nnen nat\u00fcrlich den Code etwas abk\u00fcrzen, aber eben nur mit eigener Implementierung. Zwei Strategien bieten sich an: durch Delegation oder Vererbung. Nehmen wir das Beispiel f\u00fcr TimerTask und gehen beide Varianten durch:<\/p>\n<p>import java.util.*;<\/p>\n<p>class TimerTaskLambda {<\/p>\n<p>public static TimerTask createTimerTask( <b>Runnable<\/b> <b>runnable<\/b> ) {<\/p>\n<p>return new TimerTask() {<\/p>\n<p>@Override public<b> void run() { runnable.run(); }<\/b><\/p>\n<p>};<\/p>\n<p>}<\/p>\n<p>public static void main( String[] args ) {<\/p>\n<p>new Timer().schedule( <b>createTimerTask( () -&gt; System.out.println(&quot;Hi&quot;) )<\/b>, 500 );<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>Oder mit Vererbung:<\/p>\n<p>public class LambdaTimerTask <b>extends TimerTask<\/b> {<\/p>\n<p>private final Runnable runnable;<\/p>\n<p>public LambdaTimerTask( Runnable runnable ) {<\/p>\n<p>this.runnable = runnable;<\/p>\n<p>}<\/p>\n<p>@Override public <b>void run() { runnable.run(); }<\/b><\/p>\n<p>}<\/p>\n<p>Der Aufruf ist dann statt createTimerTask(\u2026) der des Konstruktors:<\/p>\n<p>new Timer().schedule( <b>new LambdaTimerTask( () -&gt; System.out.println(&quot;Hi&quot;) )<\/b>, 500 );<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Als die Entwickler Lambda-Ausdr\u00fccke diskutierten, stand auch die Frage im Raum, ob abstrakte Klassen, die nur \u00fcber eine abstrakte Methode verf\u00fcgen \u2013 fr\u00fcher wurde hier die Abk\u00fcrzung SAM (Single Abstract Method) genutzt \u2013, ebenfalls f\u00fcr Lambda-Ausdr\u00fccke genutzt werden k\u00f6nnen. Sie entschieden sich dagegen, da bei Implementierung von Schnittstellen die JVM weitreichende Optimierungen vornehmen kann. Und [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[11,66],"tags":[],"class_list":["post-1849","post","type-post","status-publish","format-standard","hentry","category-insel","category-java-8"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1849","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=1849"}],"version-history":[{"count":0,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1849\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=1849"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=1849"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=1849"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}