[JAVA] Punkt 41: Verwenden Sie Markierungsschnittstellen, um Typen zu definieren

41. Verwenden Sie die Markierungsschnittstelle zur Typdefinition

[Marker-Schnittstelle](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%BC%E3%82%AB%E3%83%BC%E3%82%A4%E3% 83% B3% E3% 82% BF% E3% 83% 95% E3% 82% A7% E3% 83% BC% E3% 82% B9) ist eine Klasse, die keine Methodendefinition enthält und einfach die Schnittstelle implementiert. Ist zu zeigen, dass ein bestimmtes Attribut hat. Ein Beispiel ist die `` `Serializable``` -Schnittstelle (Kapitel 12). Die Implementierung dieser Schnittstelle zeigt, dass Instanzen dieser Klasse in "ObjectOutputStream" geschrieben werden können.

Mit dem Aufkommen von Markierungsanmerkungen (Punkt 39) mag die Markierungsschnittstelle veraltet erscheinen, aber es ist ein Fehler. Die Markierungsschnittstelle bietet zwei Vorteile gegenüber Markierungsanmerkungen. Das erste ist, dass ** die Marker-Schnittstelle den Typ definiert, aber nicht ** die Marker-Annotation. Auf diese Weise können Fehler zur Kompilierungszeit abgefangen werden, die erst zur Laufzeit von Markierungsanmerkungen erfasst werden können. Die Serialisierungsfunktion von Java verwendet die Markierungsschnittstelle "Serializable", um anzuzeigen, dass der Typ serialisierbar ist. Die Methode `ObjectOutputStream.writeObject``` serialisiert das übergebene Objekt, erfordert jedoch, dass seine Argumente serialisierbar sind. Wenn das Argument dieser Methode "Serializable" ist (tatsächlich wird ein Objekt benötigt), kann es durch Kompilierung erkannt werden, wenn ein Argument eines unangemessenen Typs auftritt. Das zweite ist, dass die ** Marker-Oberfläche prägnanter und zielgerichteter ** ist. Wenn das Ziel der Markierungsanmerkung "ElementType.TYPE" ist, werden alle Klassen und Schnittstellen als Ziel ausgewählt. Bei der Markierungsschnittstelle ist sie jedoch auf die Klasse beschränkt, die sie implementiert. ```set```Die Schnittstelle ist eine solche Grenzmarkierungsschnittstelle. Set ist nur in Collection-Subtypen implementiert, fügt jedoch den in Collection definierten Methoden nichts hinzu. Set definiert einige der Methoden der Sammlung neu, sodass es im Allgemeinen nicht als Markierungsschnittstelle betrachtet wird. Es ist jedoch leicht vorstellbar, dass eine Markierungsschnittstelle nur für einen bestimmten Schnittstellensubtyp gilt und die Methoden der Schnittstelle nicht neu definiert. Eine solche Markierungsschnittstelle beschreibt einen unveränderlichen Wert (?) Für das gesamte Objekt oder gibt an, dass seine Instanz für die Verarbeitung durch eine Methode einer anderen bestimmten Klasse (in diesem Sinne `) angepasst ist. Die Serializable -Schnittstelle zeigt an, dass die Instanz für die Verarbeitung durch `` `ObjectOutputStream) geeignet ist.

** Der Vorteil von Markierungsanmerkungen besteht darin, dass sie Teil einer größeren Anmerkungsfunktion sind. ** Daher werden Markierungsanmerkungen in einem auf Anmerkungen basierenden Framework aus Gründen der Konsistenz berücksichtigt.

Wie verwende ich die Markierungsanmerkung und die Markierungsschnittstelle richtig?

Erstens besteht die einzige Möglichkeit, anderen Elementen als Klassen und Schnittstellen Markierungen hinzuzufügen, darin, Markierungsanmerkungen zu verwenden. In Bezug auf Marker für Klassen und Schnittstellen *** Haben Sie jemals eine oder mehrere Methoden geschrieben, die nur auf Objekte mit dieser Markierung abzielen? *** *** Erwägen. Wenn Sie etwas zu schreiben haben, sollten Sie die Markierungsschnittstelle verwenden. Dies ermöglicht die Typprüfung von Methodenargumenten zur Kompilierungszeit. Wenn Sie es nicht schreiben, sollten Sie Markierungsanmerkungen verwenden. Markierungsanmerkungen sollten für die Markierung in Frameworks ausgewählt werden, die viele Anmerkungen verwenden.

Recommended Posts

Punkt 41: Verwenden Sie Markierungsschnittstellen, um Typen zu definieren
Punkt 26: Verwenden Sie keine Rohtypen
Punkt 65: Schnittstellen der Reflexion vorziehen
Punkt 64: Verweisen Sie auf Objekte anhand ihrer Schnittstellen
Punkt 61: Bevorzugen Sie primitive Typen gegenüber primitiven Boxen
Punkt 44: Bevorzugen Sie die Verwendung von Standardfunktionsschnittstellen
Punkt 31: Verwenden Sie begrenzte Platzhalter, um die API-Flexibilität zu erhöhen
Punkt 89: Für die Steuerung bevorzugen Sie Aufzählungstypen gegenüber readResolve
Verwendung von Map
Wie benutzt man rbenv?
Verwendung mit_option
Verwendung von fields_for
Verwendung von java.util.logging
Verwendung der Karte
Verwendung von collection_select
Lassen Sie uns den Pfad durchgehen, um Docker-Slim zu verwenden
Wie benutzt man Twitter4J
Wie benutzt man active_hash! !!
Verwendung von MapStruct
Punkt 52: Verwenden Sie Überladung mit Bedacht
Verwendung von TreeSet
[Verwendung des Etiketts]
Punkt 53: Verwenden Sie Varargs mit Bedacht
Wie man Identität benutzt
Wie man Hash benutzt
Punkt 45: Verwenden Sie Streams mit Bedacht
Verwendung von Dozer.mapper
Wie benutzt man Gradle?
Verwendung von org.immutables
Verwendung von java.util.stream.Collector
Verwendung von VisualVM
Punkt 29: Generische Typen bevorzugen
Verwendung von Map