Markör gränssnitt mönster
Markörgränssnittsmönstret är ett designmönster inom datavetenskap , som används med språk som tillhandahåller runtime-information om objekt . Det ger ett sätt att associera metadata med en klass där språket inte har explicit stöd för sådan metadata.
För att använda det här mönstret implementerar en klass ett markörgränssnitt (även kallat taggningsgränssnitt ) som är ett tomt gränssnitt, och metoder som interagerar med instanser av den klassen testar gränssnittets existens. Medan ett typiskt gränssnitt specificerar funktionalitet (i form av metoddeklarationer) som en implementerande klass måste stödja, behöver ett markörgränssnitt inte göra det. Bara närvaron av ett sådant gränssnitt indikerar specifikt beteende hos den implementerande klassen. Hybridgränssnitt, som både fungerar som markörer och anger nödvändiga metoder, är möjliga men kan visa sig förvirrande om de används på felaktigt sätt.
Exempel
Ett exempel på tillämpningen av markörgränssnitt från programmeringsspråket Java är gränssnittet Serializable :
paket java.io ; offentligt gränssnitt Serialiserbart { }
En klass implementerar detta gränssnitt för att indikera att dess icke- transienta datamedlemmar kan skrivas till en ObjectOutputStream
. Den privata metoden ObjectOutputStream
writeObject0(Object,boolean)
innehåller en serie instanser av
tester för att fastställa skrivbarhet, varav en letar efter det serialiserbara
gränssnittet. Om något av dessa test misslyckas, skickar metoden ett NotSerializableException
.
Kritik
Ett stort problem med markörgränssnitt är att ett gränssnitt definierar ett kontrakt för implementering av klasser, och det kontraktet ärvs av alla underklasser. Det betyder att du inte kan "unimplementera" en markör. I exemplet som ges, om du skapar en underklass som du inte vill serialisera (kanske för att den beror på övergående tillstånd), måste du ta till uttryckligen att kasta NotSerializableException
(per ObjectOutputStream-
dokument)
En annan lösning är att språket stöder metadata direkt:
- Både .NET Framework och Java (från och med Java 5 (1.5)) ger stöd för sådan metadata. I .NET kallas de "anpassade attribut" , i Java kallas de " annoteringar " . Trots det olika namnet är de begreppsmässigt samma sak. De kan definieras på klasser, medlemsvariabler, metoder och metodparametrar och kan nås med reflektion .
- I Python är termen "markörgränssnitt" vanlig i Zope och Plone . Gränssnitt deklareras som metadata och underklasser kan använda
implementsOnly
för att deklarera att de inte implementerar allt från sina superklasser.
Se även
- Designa markörer för en expansion av detta mönster.
Vidare läsning
Effektiv Java av Joshua Bloch .
- ^ Bloch, Joshua (2018). Effektiv Java (tredje upplagan). Boston. ISBN 978-0-13-468599-1 . OCLC 1018432176 .