Frage

Während der Parsen bestimmter XML-Dateien, stoße ich auf eine Situation, die ich habe Schnittstelle zu verwenden, wie Etiketten, die bestimmte Tags zu bestimmten Kategorie gehören zu identifizieren, zum Beispiel, habe ich eine Tag Schnittstelle zu erkennen, dass diese Klassen verwendet xML-Tags zu repräsentieren, und ContainableTag , darauf hinzuweisen, dass bestimmte Tags eines der Kinder Tags von einigen Tags werden kann.

Dann stolpere ich in dieser Seite: http://xahlee.org/java-a -Tages / interface.html (Bitte suchen Sie nach der " Schnittstelle als Labels " Session.). Dort heißt es:

  

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

So ist Schnittstelle als Etikett unbedingt eine schlechte Praxis? Als Java-Programmierer, haben wir einige andere Alternativen haben?

War es hilfreich?

Lösung

Schnittstellen als Marker weitgehend ersetzt in Java 5 durch die Annotation Mechanismus gewesen oder später. Sie ermöglichen es, beliebige Metadaten hinzuzufügen. Wenn Ihre Schnittstellen sind leer und dienen nur als Klasse Marker zu handeln, dann sollten Sie stattdessen mit Anmerkungen sein.

Andere Tipps

Während Anmerkungen eine Alternative für bereitstellen, welche Marker Schnittstellen zu erreichen, sind sie in Java nur zur Verfügung, und die Integration nicht gut mit IDEs: Ich benutze Marker-Schnittstellen auch verwandte Konzepte in meinem Projekt zu markieren, und dann kann ich den Typen verwenden Hierarchie-Browser alle Mitglieder zu finden (ich denke, das wird schließlich von den großen IDEs für Anmerkungen bald unterstützt werden).

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 [ Random] als Schnittstelle ... "). Das ist rückwärts denken, meiner Meinung nach.

Ich würde behaupten, dass die Orte, in denen ein solcher Marker-Schnittstelle in ein verwendet wird `Instanceof‘ Anweisung, invertierte Logik verwenden, aber solange man innerhalb einer Sprache ohne Mehrfachvererbung, Aspekte und Anmerkungen stecken geblieben sind, sehe ich nicht besser Weg dies zu tun, ohne aus der Basissprache zu treten.

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

Anmerkungen sind nicht unbedingt das, was Sie wollen. Tagging-Schnittstellen sind eine Möglichkeit, eine Eigenschaft eines Typs in der Art der Arbeit selbst. Zum Beispiel, wenn Sie dabei sind das Schreiben von Code zu starten wie folgt aussehen:

@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 glauben nicht, das sieht besser:

interface ContainableTag {}

public class Foo implements ContainableTag {}

// ... elsewhere...

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

Sicher, die Tagging-Schnittstelle bietet keine Informationen darüber, welche das Verhalten der Typ selbst bietet, aber es hat zulassen, dass andere Arten dieser nicht-Verhaltenseigenschaft erzwingen. Ich würde auf jeden Fall eine Menge von lästigen Bugs verschont, wenn ObjectOutputStream eine writeObject(Serializable) Methode hat statt writeObject(Object).

Edit: Ich habe

scroll top