2009-08-18 15 views

Antwort

5

Denn manchmal, es macht wirklich Sinn, wenn eine Eigenschaft eines Typs kann als eine Art selbst verwendet werden - Serializable in den Sinn kommt. Wenn ich eine Methode wie folgt machen:

public void save(Object data){ ... } 

... Sie wissen nicht wirklich, wie die data gespeichert werden. VM-Serialisierung? Bean-Eigenschaft Serialisierung? Irgendein homebrewed Schema? Während, wenn Sie es so schreiben:

public void save(Serializable data){ ... } 

... es ist ganz klar (wenn auch nur der Designer ObjectOutputStream dieser Möglichkeit Gebrauch gemacht hatte!). Manchmal ist es sinnvoll, Anmerkungen zu verwenden, wenn Sie Metadaten zu Typen hinzufügen möchten. In diesem Fall würde ich jedoch für eine Tagging-Schnittstelle plädieren.

1

Es wurde verwendet, um einige Eigenschaften einer Klasse zu erwähnen (wie Serializable zeigt, dass die Klasse serialisieren darf). Jetzt können Anmerkungen diesen Job erledigen.

+0

Nein, Anmerkungen kein Ersatz für Marker-Schnittstellen sind. – skaffman

+1

@skaffman: Ist es etwas anderes, als dass es schwieriger ist, nach einer Anmerkung zu suchen, als nach einer Schnittstelle, bei der man sagt: "Anmerkungen sind kein Ersatz für Markierungsschnittstellen"? –

+0

Man kann Code mit Ausnahme von Klassen annotieren. Man kann auch Anmerkungen mit Argumenten verwenden. Nehmen Sie zum Beispiel die JSR 305 '@ ScriptAssert' Validierungsannotation. –

6

Eine Tagging-Schnittstelle ist normalerweise mit Magie verbunden: entweder direkt in die VM integriert oder mit Reflektion. Da sich die Magie technisch auf jede Klasse anwenden lässt, verwenden Sie das Tagging, um anzuzeigen, dass Sie über die Magie und ihre Eignung für Ihre Klasse gut nachgedacht haben.

+0

Dies ist das einzige Rollenmarker-Interface. – adatapost

+0

Ist es das? Es scheint mir, dass die Erweiterung einer Tagging-Schnittstelle eine Typüberprüfung zur Kompilierzeit für Methoden bereitstellen kann, die nur Objekte akzeptieren, deren Typ eine Erweiterung der Tagging-Schnittstelle ist. Sehen Sie sich beispielsweise EventListenerList.add an. –

6

Die Frage der Marker-Schnittstellen vs Annotationen in Blochs „Effective Java“ diskutiert, und ein Teil dieser Sektion verfügbar ist auf Google Bücher here

+0

+1 - Bloch, wie immer, fasst es gut zusammen und beantwortet meinen Kommentar/Frage zu @ Mnemenths Antwort. –

0

Zusätzlich zu den anderen Antworten Marker-Schnittstellen auch verwendet werden können, zusätzlich zu spezifizieren Eigenschaften einer Klasse, die nicht von einer anderen bereits implementierten Schnittstelle geerbt wird. Ein Beispiel dafür wäre die Schnittstelle RandomAccess. Er bezeichnet eine Sammlung, auf die nach dem Zufallsprinzip ohne Leistungsverlust zugegriffen werden kann und auf die nicht über einen Iterator zugegriffen werden muss, um diese Leistung zu erzielen.

0

Sie können Ihre Klasse mit einer Tagging-Schnittstelle versehen, um Ihren Mitentwicklern und Kunden Ihrer Klasse mitzuteilen, dass Sie diese Funktionalität ausdrücklich unterstützen. Denken Sie an Serializable; Jemand, der eine Sitzung persistieren muss und Serialisierung dazu verwendet, kann ein Objekt Ihrer Klasse sicher verwenden.

Es kann weiter in Reflexion verwendet werden; Heutzutage ist es üblich Annotationen dafür zu verwenden, aber in den alten Tagen kann man eine Klasse überprüfen, prüfen, ob sie eine bestimmte Schnittstelle implementiert (wie DAO) und falls ja, das Objekt weiter verarbeiten (ich denke hier an die Entity Annotation)).

0

Tagging Schnittstellen Schnittstellen ohne abstrakte Methoden innen sind, werden sie verwendet, um einen Datentyp für die Klasse hinzuzufügen, die sie implementiert und eine übergeordnete Schnittstelle für andere Schnittstellen (vor allem bei Mehrfachvererbung in Schnittstellen)

public interface name {} 
public interface john1 {} 
public interface john2 {} 
public interface Demo extends john1 , john2 , name {} 
zu sein

** Wenn JVM die Namensschnittstelle sieht, wird es herausfinden, dass die Demo ein bestimmtes Cenario ausführt.

0

Ich möchte auch hinzufügen, die Sie Tagging Schnittstellen Besitz einer Instanz beschränken können:

interface IFlumThing; 
interface IFlooThing; 

class BaseThing {...} 

class FlumThing extends BaseThing implements IFlumThing {}; 
class FlooThing extends BaseThing implements IFlooThing {}; 

class Flum { 
    addThing(IFlumThing thing){...}; 
} 

class Floo { 
    addThing(IFlooThing thing){...}; 
}