Markierungsschnittstellenmuster
Das Markierungsschnittstellenmuster ist ein Designmuster in Informatik, verwendet mit Sprachen, die Informationen zu Laufzeittypen zu Objekten liefern. Es bietet ein Mittel, um Metadaten mit einer Klasse zu verbinden, in der die Sprache keine explizite Unterstützung für solche Metadaten hat.
Um dieses Muster zu verwenden, a Klasse implementiert a Markierungsschnittstelle[1] (auch genannt Tagging -Schnittstelle) Das ist eine leere Schnittstelle,[2] und Methoden, die mit Instanzen dieses Klassentests für die Existenz der Schnittstelle interagieren. Während eine typische Schnittstelle Gibt die Funktionalität (in Form von Methodenerklärungen) an, die eine implementierende Klasse unterstützen muss, eine Markierungsschnittstelle muss dies nicht tun. Das bloße Vorhandensein einer solchen Schnittstelle zeigt ein spezifisches Verhalten der Implementierungsklasse an. Hybrid -Schnittstellen, die beide als Marker fungieren und die erforderlichen Methoden spezifizieren, sind möglich, können sich jedoch als verwirrend erweisen, wenn sie nicht ordnungsgemäß verwendet werden.
Beispiel
Ein Beispiel für die Anwendung von Marker -Schnittstellen aus dem Java -Programmiersprache ist der Serialisierbar
Schnittstelle:
Paket Java.io; Öffentlichkeit Schnittstelle Serialisierbar { }
Eine Klasse implementiert diese Schnittstelle, um anzuzeigen, dass sie nichtvorübergehend Datenmitglieder können an eine geschrieben werden ObjectOutputStream
. Das ObjectOutputStream
Privatmethode writeObject0 (Objekt, boolean)
enthält eine Reihe von Instanz
Tests zur Bestimmung der Schreibbarkeit, von denen einer nach dem sucht Serialisierbar
Schnittstelle. Wenn einer dieser Tests fehlschlägt, wirft die Methode a NotSerializableException
.
Kritik
Ein Hauptproblem bei Marker -Schnittstellen besteht darin, dass eine Schnittstelle einen Vertrag für die Implementierung von Klassen definiert und dieser Vertrag von allen Unterklassen vererbt wird. Dies bedeutet, dass Sie einen Marker nicht "entwerben" können. Wenn Sie im angegebenen Beispiel eine Unterklasse erstellen, die Sie nicht serialisieren möchten (möglicherweise weil sie vom vorübergehenden Zustand abhängt), müssen Sie auf explizites Werfen zurückgreifen NotSerializableException
(pro ObjectOutputStream
Dokumente)
Eine andere Lösung besteht darin, dass die Sprache unterstützt wird Metadaten direkt:
- Beide .NET Framework und Java (Ab Java 5 (1,5)) bieten diese Metadaten Unterstützung. In .NET werden sie genannt "benutzerdefinierte Attribute", in Java werden sie genannt "Anmerkungen". Trotz des unterschiedlichen Namens sind sie konzeptionell dasselbe. Sie können in Klassen, Mitgliedsvariablen, Methoden und Methodenparametern definiert werden und können mit Verwendung zugegriffen werden Betrachtung.
- Im PythonDer Begriff "Marker -Schnittstelle" ist häufig in Zope und Plonen. Schnittstellen werden als Metadaten deklariert und Unterklassen können verwendet werden
implementiert
um zu erklären, dass sie nicht alles aus ihren Superklassen umsetzen.
Siehe auch
- Entwurfsmarkierungen für eine Ausdehnung dieses Musters.
Verweise
- ^ Bloch, Joshua (2008). "Artikel 37: Verwenden Sie Marker -Schnittstellen, um Typen zu definieren". Effektive Java (zweite Ausgabe). Addison-Wesley. p.179. ISBN 978-0-321-35668-0.
- ^ "Markerschnittstelle in Java". Geeksforgeeks. 2017-03-06. Abgerufen 2022-05-01.
Weitere Lektüre
Effektiver Java[1] durch Joshua Bloch.
- ^ Bloch, Joshua (2018). Effektiver Java (Dritter Aufl.). Boston. ISBN 978-0-13-468599-1. OCLC 1018432176.