2013-03-04 4 views
5

Da Marker-Interfaces meistens nur zum Markieren einer Klasse nützlich sind, kann das gleiche durch Annotationen erreicht werden. Zum Beispiel Cloneable Schnittstelle kann @Cloneable sein.Können Annotationen Marker Interfaces vollständig ersetzen?

Gibt es noch Bedarf für Marker-Schnittstellen oder kann durch Annotationen relpaced werden? Gibt es irgendwelche Vorteile/Nachteile bei der Verwendung von ihnen? Ich meine lieber einen anderen vorziehen?

+1

Marker-Schnittstelle wurde als Antipattern noch vor Generics etabliert. –

+0

@MarkoTopolnik zuvor Marker-Schnittstellen wurden für Metadaten benötigt, aber das gleiche kann jetzt mithilfe von Anmerkungen erreicht werden. Deshalb wird es ein Anti-Muster genannt, habe ich recht? –

+0

Ja, sogar auf Java 1.4 gab es Empfehlungen für das Design ohne Marker-Schnittstellen. Marker-Interfaces sind ein Missbrauch des Konzepts des Polymorphismus. –

Antwort

3

Marker-Interfaces sind besser als Annotationen, wenn sie zum Definieren eines Typs verwendet werden. Zum Beispiel kann Serializable verwendet werden (und sollte verwendet werden) als der Typ eines Arguments, das serialisierbar sein muss. Eine Anmerkung erlaubt es nicht, das zu tun:

public void writeToFile(Serializable object); 

Wenn die Marker-Schnittstelle keinen Typen definieren, sondern nur Meta-Daten, dann eine Anmerkung ist besser.

1

Noch eine Sache zu erwähnen wären die Kosten für die Verwendung von Anmerkungen. Um zu überprüfen, ob das Objekt eine Instanz einer Schnittstelle ist, kann man instanceof verwenden, was heutzutage eine relativ kostengünstige Operation ist. Die Verwendung von Anmerkungen erfordert Java reflection Anrufe und ist viel teurer.