{"id":2288,"date":"2013-09-09T20:08:33","date_gmt":"2013-09-09T18:08:33","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=2288"},"modified":"2013-09-09T20:08:33","modified_gmt":"2013-09-09T18:08:33","slug":"was-sind-markierungsschnittstellen-marker-interfaces","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2013\/09\/was-sind-markierungsschnittstellen-marker-interfaces\/","title":{"rendered":"Was sind Markierungsschnittstellen (Marker-Interfaces)?"},"content":{"rendered":"<p><i>Markierungsschnittstellen kann man als Design-Pattern ansehen. Sie tauchen zwar nicht so h\u00e4ufig auf, doch Java kennt mit Serializable und Remote zwei prominente Vertreter.<\/i><\/p>\n<p>Es anderes Beispiel soll hergestellt werden: Eine Textverarbeitung speichert in erster Linie Text. Dazu kommen noch weitere Datentypen wie Tabellen, Grafiken oder Formeln, aber wie der Name Textverarbeitung zeigt, ist der Datentyp im Kern Text. Etwas genauer betrachtet besteht der Text aus Seiten, Abs\u00e4tzen, Zeilen und Zeichen.<\/p>\n<p>Frage: Nehmen wir an, dass die Textverarbeitung f\u00fcr jedes Zeichen ein Objekt vorsieht, welches in einer langen verketteten Liste gespeichert ist. Beim Eintippen neuer Buchstaben werden neue Objekte in die Liste eingef\u00fcgt und beim L\u00f6schen entfernt. Stellt die Textverarbeitung eine Seite dar, wird die Liste sequentiell abgelaufen und jedes Element auf dem Bildschirm ausgegeben. Jedes ausgegebene Zeichen bekommt eine Position und diese wird laufend angepasst.<\/p>\n<p>Zu den normalen druckbaren Zeichen wie Buchstaben und Ziffern kommen Sonderzeichen hinzu. Ein Objektmodell kann dann so aussehen, dass eine Schnittstelle notwendiges f\u00fcr alle Zeichen vorschreibt. Nennen wir die Schnittstelle WordCharacter und geben wir ihr die Methoden getChar(), getCharWidth(), getCharHeight() und drawChar(). Als Unterklassen k\u00f6nnte dann OrdinaryCharacter die druckbaren Zeichen behandeln und MetaCharacter die Sonderzeichen wie Tabulator, Leerzeichen, Return. L\u00e4uft ein Algorithmus zur Visualisierung durch die Datenstruktur, besorgt er sich jedes Zeichen, fragt wie lang es ist und ob es mit dem Wort noch in die Zeile passt. Wenn ja, wird die Zeichenposition auf der x-Achse um die Breite des Zeichens erweitert und das n\u00e4chste Zeichen wird ausgegeben.<\/p>\n<p>Ein Leerzeichen nimmt unter den Sonderzeichen eine besondere Stelle ein. Das liegt auch daran, dass der Leerraum unter Umst\u00e4nden noch erweitert wird, etwa beim Blocksatz. Dann kommt zu jeder Breite eines Leerzeichens noch zus\u00e4tzlicher Wei\u00dfraum dazu.<\/p>\n<p>Wie wird die Textverarbeitung normale Zeichen und Leerzeichen verarbeiten, wenn eine Zeile ausgeben wird? Da Leerzeichen nichts auf dem Bildschirm ausgehen, sollen sie besonders behandelt werden.<\/p>\n<p>Eine L\u00f6sung: Wenn in der Datenstruktur die Zeichen der Reihe nach vorliegen, wird man in einer Fallunterscheidung feststellen k\u00f6nnen, ob es sich um ein Leerzeichen handelt oder um anderes Zeichen.<\/p>\n<pre>f\u00fcr alle Zeichen einer Zeile\n  Character c ist das aktuelle Element\n  ist c.getChar() != ' '\n    dann verarbeite das Element weiter<\/pre>\n<p>Problem: Falls es nun weitere Elemente gibt, die eine \u00e4hnliche Sonderbehandlung haben wie das Leerzeichen, wird die Fallunterscheidung immer l\u00e4nger werden. Das wird sie auch, denn es gibt neben dem Standard-Leerzeichen noch weitere Zeichen, die f\u00fcr die Wei\u00dfraum zust\u00e4ndig sind. Dazu z\u00e4hlt der Tabulator oder das nicht-trennende Leerzeichen. Wenn diese Fallunterscheidung auch noch an anderen Stellen eingesetzt wird, etwa beim Export der Daten in HTML, PDF, m\u00fcssen die Entwickler darauf achten, \u00c4nderungen an der if-Anweisung auch konsistent an den anderen Stellen anzuwenden.<\/p>\n<p>Pattern: Unsere bisherige Unterscheidung war nur auf Grund des Zeichencodes. Interessant ist, wenn das Leerzeichen noch einen weiteren Typ besitzt, denn wenn ein Wei\u00dfraum-Objekt etwa den Typ WhitespaceChracter haben w\u00fcrde, lie\u00dfe sich wiederum instanceof einsetzen, um herauszufinden, ob ein Zeichen-Objekt ein Leerzeichen ist oder nicht. Eine Fallunterscheidung mit vielen if-Anfragen f\u00e4ll raus und es bleibt eine einfache instanceof-Abfrage. Alle Wei\u00dfraum-Objekte legen wir dann so aus, dass sie einen speziellen Typ haben. Dazu kann ein Leerzeichen-Objekt eine Schnittstelle implementieren, die keine Funktionen vorschreibt.<\/p>\n<p>Eine leere Schnittstelle nennt sich Marker-Interface oder Tag-Interface. Sie markiert ein Objekt mit einem Typ, der anschlie\u00dfend mit instanceof \u00fcberpr\u00fcft werden kann. In Java. Es gibt ein Java Marker-Interfaces an einigen Stellen. Die interessanteste Schnittstelle ist java.io.Serializable. Sie markiert alle Objekte, die \u00fcber die Standardserialisierung automatisch geschrieben werden k\u00f6nnen. Eine Klasse, die nicht Serializabe ist, die aber trotzdem geschrieben werden soll, wird bei dem Serialisierungs-Vorgang einen Ausnahme melden.<\/p>\n<p>Ein zweites Beispiel ist die Schnittstelle Remote. Sie wird ben\u00f6tigt, wenn Objekte \u00fcber RMI verteilt angeboten werden sollen. Nur Objekte, die Remote implementieren werden RMI-f\u00e4hig sein. Eine weitere Schnittstelle ist Clonable. Sie erm\u00f6glichst erst das Klonen von Objekten mit einer clone()-Funktion.<\/p>\n<p>Seit Java 5 sind Annotationen eine Alternative zu Markierungsschnittstellen und daher seltener zu finden.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Markierungsschnittstellen kann man als Design-Pattern ansehen. Sie tauchen zwar nicht so h\u00e4ufig auf, doch Java kennt mit Serializable und Remote zwei prominente Vertreter. Es anderes Beispiel soll hergestellt werden: Eine Textverarbeitung speichert in erster Linie Text. Dazu kommen noch weitere Datentypen wie Tabellen, Grafiken oder Formeln, aber wie der Name Textverarbeitung zeigt, ist der Datentyp [&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":[1],"tags":[],"class_list":["post-2288","post","type-post","status-publish","format-standard","hentry","category-allgemein"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2288","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=2288"}],"version-history":[{"count":1,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2288\/revisions"}],"predecessor-version":[{"id":2289,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2288\/revisions\/2289"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=2288"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=2288"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=2288"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}