{"id":1681,"date":"2013-02-01T08:31:59","date_gmt":"2013-02-01T06:31:59","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=1681"},"modified":"2013-02-01T08:31:59","modified_gmt":"2013-02-01T06:31:59","slug":"statische-ausprogrammierte-methoden-in-schnittstellen","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2013\/02\/statische-ausprogrammierte-methoden-in-schnittstellen\/","title":{"rendered":"Statische ausprogrammierte Methoden in Schnittstellen"},"content":{"rendered":"<p>In der Regel deklariert eine Schnittstelle Operationen, also abstrakte Objektmethoden, die eine Klasse sp\u00e4ter implementieren muss. Die in Klassen implementiere Schnittstellenmethode kann sp\u00e4ter wieder \u00fcberschrieben werden, nimmt also ganz normal an der dynamischen Bindung teil. Einen Objektzustand kann die Schnittstelle nicht deklarieren, denn Objektvariablen sind in Schnittstellen tabu \u2013 jede deklarierte Variable ist automatisch statisch, also eine Klassenvariable.<\/p>\n<p>Ab Java 8 lassen sich in Schnittstellen statische Methoden unterbringen und als Utility-Methoden neben Konstanten stellen. Als statische Methoden werden sie nicht dynamisch gebunden und der Aufruf ist ausschlie\u00dflich \u00fcber den Namen der Schnittstelle m\u00f6glich. (Bei statischen Methoden von Klassen ist im Prinzip auch der Zugriff \u00fcber eine Referenz erlaubt, wenn auch unerw\u00fcnscht.)<\/p>\n<p>Beispiel:<\/p>\n<p>interface Buyable {   <br \/>int MAX_PRICE = 10_000_000;<\/p>\n<p>static boolean isValidPrice( double price ) { return price &gt;= 0 &amp;&amp; price &lt; MAX_PRICE; }   <br \/>double price();    <br \/>}<\/p>\n<p>Von au\u00dfen ist dann der Aufruf Buyable.isValidPrice(123) m\u00f6glich.<\/p>\n<p>Alle deklarieren Eigenschaften sind immer implizit public, sodass dieser Sichtbarkeitsmodifizierer redundant ist.<\/p>\n<p>Fassen wir die erlaubten Eigenschaften einer Schnittstelle zusammen:   <\/p>\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td valign=\"top\" width=\"186\">&nbsp;<\/td>\n<td valign=\"top\" width=\"186\">\n<p>Attribut<\/p>\n<\/td>\n<td valign=\"top\" width=\"186\">\n<p>Methode<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"186\">\n<p>Objekt-<\/p>\n<\/td>\n<td valign=\"top\" width=\"186\">\n<p>Nein, nicht erlaubt<\/p>\n<\/td>\n<td valign=\"top\" width=\"186\">\n<p>Ja, \u00fcblicherweise abstrakt<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"186\">\n<p>Statische(s)<\/p>\n<\/td>\n<td valign=\"top\" width=\"186\">\n<p>Ja, als Konstante<\/p>\n<\/td>\n<td valign=\"top\" width=\"186\">\n<p>Ja, immer mit Implementierung<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Erlaubte Eigenschaften einer Schnittstelle<\/p>\n<p>&#160;<\/p>\n<p>Design: Eine Schnittstelle mit nur statischen Methoden ist ein Zeichen f\u00fcr ein Designproblem und sollte durch eine finale Klasse mit privaten Konstruktor ersetzt werden. Schnittstellen sind immer als Vorgaben zum Implementieren gedacht und wenn nur statische Methoden vorgekommen, erf\u00fcllt die Schnittstelle nicht ihren Zweck, dass sie Vorgaben macht, die unterschiedlich umgesetzt werden k\u00f6nnen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In der Regel deklariert eine Schnittstelle Operationen, also abstrakte Objektmethoden, die eine Klasse sp\u00e4ter implementieren muss. Die in Klassen implementiere Schnittstellenmethode kann sp\u00e4ter wieder \u00fcberschrieben werden, nimmt also ganz normal an der dynamischen Bindung teil. Einen Objektzustand kann die Schnittstelle nicht deklarieren, denn Objektvariablen sind in Schnittstellen tabu \u2013 jede deklarierte Variable ist automatisch statisch, [&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-1681","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\/1681","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=1681"}],"version-history":[{"count":0,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1681\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=1681"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=1681"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=1681"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}