Ist Interface als Label eine schlechte Übung in Java OO?

7

Beim Parsen bestimmter xml-Dateien stoße ich auf eine Situation, in der ich die Schnittstelle als Label verwenden muss, um zu erkennen, dass bestimmte Tags zu einer bestimmten Kategorie gehören, zum Beispiel habe ich eine Tag -Schnittstelle erstellt Identifizieren Sie, dass diese Klassen zur Darstellung von XML-Tags und ContainableTag verwendet werden, um darauf hinzuweisen, dass bestimmte Tags zu den untergeordneten Tags einiger Tags gehören können.

Dann stolpere ich auf diese Seite: Ссылка (Bitte suchen Sie nach dem " Interface als Labels "Sitzung.". Es sagt:

  

Der Kern des Problems ist, dass es so ist   ein Stück mathematischer Irrelevanz in   die Sprache. Als ein Markierungsmechanismus   in einer Sprache, für das Mögliche   Profitieren Sie von der Softwareentwicklung   Perspektive, dann sollte es nicht sein   entworfen als Teil der Klasse   Schnittstelle, seit dem Konzept von   Etikettierung und Programmierungskonzept   Schnittstelle, sind semantisch unterschiedlich.

Also ist Interface als Label unbedingt eine schlechte Übung? Haben wir als Java-Programmierer noch andere Alternativen?

    
Winston Chen 17.09.2009, 04:12
quelle

3 Antworten

8

Interfaces als Marker wurden weitgehend durch den Annotationsmechanismus in Java 5 oder höher ersetzt. Mit ihnen können Sie beliebige Metadaten hinzufügen. Wenn Ihre Schnittstellen leer sind und nur als Klassenmarker dienen, sollten Sie stattdessen Annotationen verwenden.

    
Jherico 17.09.2009, 04:20
quelle
7

Annotationen bieten zwar eine Alternative für die Funktionen von Markerschnittstellen, sind jedoch nur in Java verfügbar und lassen sich nicht gut in IDEs integrieren: Ich verwende auch Markerschnittstellen, um verwandte Konzepte in meinem Projekt zu markieren, und kann dann den Typ verwenden Hierarchiebrowser, um alle Mitglieder zu finden (ich vermute, dass dies bald von den wichtigsten IDEs für Annotationen unterstützt wird).

Was den Artikel betrifft, den Sie erwähnen, sehe ich nicht den Sinn darin, dass, wenn eine Klasse syntaktisch / strukturell eine Schnittstelle "erfüllt", diese Schnittstelle automatisch auf die Klasse angewendet werden kann ("Jede Klasse kann sie deklarieren"). RandomAccess] als Schnittstelle ... "). Das ist meiner Meinung nach rückwärts denken.

Ich würde argumentieren, dass die Orte, an denen solch eine Markerschnittstelle in einer instanceof-Anweisung verwendet wird, invertierte Logik verwenden, aber solange Sie in einer Sprache ohne mehrfache Vererbung, Aspekte und Anmerkungen stecken, sehe ich nichts Besseres Möglichkeit, dies zu erreichen, ohne die Basissprache zu verlassen.

Beachten Sie auch, dass dieses Dead-Beat-Argument über ein leeres Interface, das immer anwendbar ist, auch auf Annotationen angewendet werden kann.

    
ShiDoiSi 17.09.2009 07:26
quelle
5

Anmerkungen sind nicht unbedingt das, was Sie möchten. Tagging-Interfaces sind eine Möglichkeit, eine Eigenschaft eines Typs in den Typ selbst zu bearbeiten. Wenn Sie beispielsweise damit beginnen, Code zu schreiben, der wie folgt aussieht:

%Vor%

Dann überlegen Sie, ob Sie wirklich nicht denken, dass das besser aussieht:

%Vor%

Sicher, die Tagging-Schnittstelle liefert keine Informationen darüber, welches Verhalten der Typ selbst bietet, aber erlaubt es anderen Typen, diese nicht verhaltensbasierte Eigenschaft durchzusetzen. Ich wäre sicherlich eine Menge lästiger Bugs verschont geblieben, wenn ObjectOutputStream eine writeObject(Serializable) Methode anstatt writeObject(Object) hätte.

Bearbeiten: Ich habe nicht unbedeutende Unterstützung hier.

    
gustafc 17.09.2009 06:20
quelle

Tags und Links