2009-09-17 14 views
7

Während die Parsen bestimmter XML-Dateien, ich auf eine Situation kommen, dass ich Schnittstelle verwenden als Etikett, dass bestimmte Tags zu bestimmten Kategorie, zum Beispiel gehören zu identifizieren, habe ich eine Tag Schnittstelle zu identifizieren, dass diese Klassen verwendet werden, um xml-Tags darzustellen, und ContainableTag, um darauf hinzuweisen, dass bestimmte Tags eine der untergeordneten Tags einiger Tags sein können.Ist Interface als Label eine schlechte Übung in Java OO?

Dann stolpere ich auf diese Seite: http://xahlee.org/java-a-day/interface.html (Bitte suchen Sie nach der "Schnittstelle als Etiketten" Sitzung.). Dort heißt es:

Der Kern des Problems ist, dass es ein Stück mathematischer Irrelevanz in die Sprache ist. Als Markierungsmechanismus in einer Sprache, für die möglichen profitiert von der Engineering Perspektive Software, dann sollte es nicht als Teil des Klasse Schnittstelle ausgelegt sein, da das Konzept der Kennzeichnung und Konzept der Programmierung Schnittstelle, sind semantisch disparat.

Also ist Schnittstelle als Etiketten unbedingt eine schlechte Praxis? Haben wir als Java-Programmierer noch andere Alternativen?

+0

Sie sollten auf die vorhandenen Abfragen zu diesem Thema bei SO hinweisen. Sie enthalten auch viele Referenzen. Interessanter Artikel, den Sie ausgegraben haben. – ShiDoiSi

Antwort

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.

+0

Ich schaue nie in die Verwendungen von Annotationen, obwohl ich es in bestimmten Frameworks verwende. Vielen Dank. Ich werde nach Tutorials googlen. Könnten Sie mir auch ein paar Links zum Annotations-Tutorial geben, wenn Sie gerade etwas zur Hand haben? –

+3

http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html Das größte Problem bei der Verwendung von Anmerkungen ist, dass Sie Ihre Anmerkungen mit einer Beibehaltung von 'Laufzeit' versehen müssen, wenn Sie möchten sie zur Laufzeit verwenden. Standardmäßig werden sie vom Compiler verworfen. – Jherico

+0

Großartig! Vielen Dank. –

5

Anmerkungen sind nicht unbedingt was Sie wollen. Tagging-Interfaces sind eine Möglichkeit, eine Eigenschaft eines Typs in den Typ selbst zu bearbeiten. Zum Beispiel, wenn Sie sind so zu beginnen Code zu schreiben suchen:

@interface ContainableTag{} 

@ContainableTag public class Foo {} 

// ... elsewhere... 

/** 
* Adds obj as a child element. 
* @throws IllegalArgumentException if obj is not tagged with 
*   the ContainableTag annotation. 
*/ 
public void addElement(Object obj){ 
    if (!obj.getClass().isAnnotationPresent(ContainableTag.class)) 
     throw new IllegalArgumentException("obj is not a ContainableTag"); 
    // add the containable tag as an element 
} 

Dann prüfen, ob Sie wirklich nicht denken, das sieht besser aus:

interface ContainableTag {} 

public class Foo implements ContainableTag {} 

// ... elsewhere... 

public void addElement(ContainableTag ct){ 
    // add the containable tag as an element 
} 

Sicher, funktioniert die Tagging-Schnittstelle nicht Geben Sie Informationen darüber an, welches Verhalten der Typ selbst bietet, aber ermöglicht anderen Typen, diese nicht verhaltensbezogene Eigenschaft zu erzwingen. Ich wäre sicherlich eine Menge lästiger Fehler erspart worden, wenn ObjectOutputStream eine writeObject(Serializable) Methode statt writeObject(Object) hätte.

Bearbeiten: Ich habe not insignificant support hier.

+0

Haha .. meine "effektiv Java "ist zu alt, um diesen Artikel zu haben. Vielen Dank. –

7

Während Annotationen eine Alternative für die Markierschnittstellen bieten, sind sie nur in Java verfügbar und lassen sich nicht gut in IDEs integrieren: Ich verwende auch Markierschnittstellen, um verwandte Konzepte in meinem Projekt zu markieren Tippe den Hierarchie-Browser, um alle Mitglieder zu finden (ich vermute, dass dies bald von den wichtigsten IDEs für Annotationen unterstützt wird).

Wie für den Artikel, den Sie erwähnen, ich sehe nicht den Punkt, in dem Argument, dass, wenn eine Klasse syntaktisch/strukturell „erfüllt“ eine Schnittstelle, die Schnittstelle kann/sollte automatisch auf die Klasse angewendet werden ("Jede Klasse kann es erklären [RandomAccess] als Schnittstelle ... "). Das ist meiner Meinung nach rückwärts denken.

ich argumentieren würde, dass die Orte, in denen ein solcher Marker-Schnittstelle in ein verwendet wird `Instanceof‘ Anweisung, verwenden invertierte Logik, aber solange man innerhalb einer Sprache ohne Mehrfachvererbung, Aspekte und Anmerkungen stecken geblieben sind, sehe ich keine besser, um dies zu erreichen, ohne die Basissprache zu verlassen.

Beachten Sie auch, dass dieses Dead-Beat-Argument über eine leere Schnittstelle, die immer anwendbar ist, auch auf Annotationen angewendet werden könnte.

+0

Schöne Punkte. Vielen Dank. –

Verwandte Themen