{"id":1624,"date":"2012-12-22T14:23:03","date_gmt":"2012-12-22T12:23:03","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=1624"},"modified":"2012-12-22T14:23:03","modified_gmt":"2012-12-22T12:23:03","slug":"abstrakte-berschriebe-schnittellenoperationen-nehmen-default-methoden-weg","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2012\/12\/abstrakte-berschriebe-schnittellenoperationen-nehmen-default-methoden-weg\/","title":{"rendered":"Abstrakte &uuml;berschriebe Schnittellenoperationen nehmen Default-Methoden weg"},"content":{"rendered":"<p>Hintergrund zur Einf\u00fchrung von Default-Methoden war die Notwendigkeit, die Java-API von Schnittstellen im Nachhinein ohne nennenswerte Compilerfehler ver\u00e4ndern zu k\u00f6nnen. Ideal ist, wenn neue Default-Methoden hinzukommen und Standard-Verhalten definieren, und es dadurch zu keinem Compiler-Fehler f\u00fcr implementierende Klassen kommt, oder zu Fehlern bei Schnittstellen, die erweiterte Schnittstellen erweitern.<\/p>\n<p>In unserem Beispiel haben wir eine Schnittstelle Buyable f\u00fcr k\u00e4ufliche Dinge vorgesehen. Dazu m\u00fcssen die \u201eDinge\u201c aber erst einmal einen Preis haben. F\u00fchren wir eine weitere Schnittstelle Priced ein:<\/p>\n<p>interface Priced {}<\/p>\n<p>interface Buyable extends Priced {<\/p>\n<p>double price();<\/p>\n<p>}<\/p>\n<p>Die Schnittstelle Prices hat keine Vorgaben, sie soll nur Typen markieren. Nehmen wir an, es gibt viele Klassen, die Priced und auch Buyable implementieren.<\/p>\n<p>In der Entwicklung stellt sich nun heraus, dass Priced auch eine Methode double price() bekommen soll. Kann die Methoden einfach als abstrakte Methode ohne Probleme hinzugekommen werden? Nicht wirklich, denn wenn es viele implementierende Klassen gibt, wird es auch viele Compilerfehler geben. Aber zur problemlosen Erweiterung von Schnittstellen sind Default-Methoden da. Kann also eine Default-Methode price() in Priced aufgenommen werden, also die Schnittstelle nachtr\u00e4glich ver\u00e4ndert werden, ohne dass es Compilerfehlen gibt? Ja, das geht.<\/p>\n<p>interface Priced {<\/p>\n<p>default double price() { return -1; }<\/p>\n<p>}<\/p>\n<p>interface Buyable extends Priced {<\/p>\n<p><b>@Override<\/b> double price();<\/p>\n<p>}<\/p>\n<p>Interessant sind zwei Details. Zun\u00e4chst einmal ist in Buyable die Methode weiterhin abstrakt, was bedeutet, eine abstrakte Methode \u00fcberschreib eine Default-Methode. Klassen, die Buyable implementieren, m\u00fcssen also weiterhin eine price()-Methode implementieren, wenn sie nicht selbst abstrakt sein wollen. Die nachtr\u00e4gliche Ver\u00e4nderung der Oberschnittstelle hat also keine Auswirkungen auf die anderen Klassen. Im Nachhinein kann aber zur Dokumentation die Annotation @Override and die Unterschnittstelle gesetzt werden. Das ist schon spannend, dass die Implementierung einer Default-Methode weggenommen werden kann. Bei der Sichtbarkeit ist das zum Beispiel nicht m\u00f6glich: ist eine Methode einmal \u00f6ffentlich, kann eine Unterklasse die Sichtbarkeit nicht einschr\u00e4nken.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hintergrund zur Einf\u00fchrung von Default-Methoden war die Notwendigkeit, die Java-API von Schnittstellen im Nachhinein ohne nennenswerte Compilerfehler ver\u00e4ndern zu k\u00f6nnen. Ideal ist, wenn neue Default-Methoden hinzukommen und Standard-Verhalten definieren, und es dadurch zu keinem Compiler-Fehler f\u00fcr implementierende Klassen kommt, oder zu Fehlern bei Schnittstellen, die erweiterte Schnittstellen erweitern. In unserem Beispiel haben wir eine Schnittstelle [&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],"tags":[],"class_list":["post-1624","post","type-post","status-publish","format-standard","hentry","category-insel"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1624","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=1624"}],"version-history":[{"count":0,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1624\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=1624"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=1624"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=1624"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}