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

Vidare läsning

Effektiv Java av Joshua Bloch .

  1. ^    Bloch, Joshua (2018). Effektiv Java (tredje upplagan). Boston. ISBN 978-0-13-468599-1 . OCLC 1018432176 .