9
votes

L'interface est-elle comme une étiquette une mauvaise pratique dans Java Oo?

Lors de l'analyse de certains fichiers XML, je rencontre une situation que je dois utiliser l'interface comme étiquettes pour identifier que certaines tags appartiennent à certaines catégories, par exemple, j'ai créé une interface étiquette à Identifiez que ces classes sont utilisées pour représenter des balises XML et CONTENABLETAG pour indiquer que certaines tags peuvent être l'une des étiquettes enfants de certaines tags.

Puis je trébuche dans cette page: http://xahlee.org/java-a -day / interface.html (veuillez rechercher l'interface " comme étiquettes " session.). Il dit:

Le gist du problème est qu'il est un morceau de perturbation mathématique dans la langue. En tant que mécanisme d'étiquetage dans une langue, pour le possible bénéficier de l'ingénierie logicielle perspective, alors il ne devrait pas être conçu dans le cadre de la classe Interface, depuis le concept de étiquetage et concept de programmation l'interface, sont sémantiquement disparates.

Ainsi, l'interface est-elle comme des étiquettes nécessairement une mauvaise pratique? En tant que programmeur Java, avons-nous d'autres alternatives?


1 commentaires

Vous devez signaler les requêtes existantes sur ce sujet à ce sujet. Ils contiennent également beaucoup de références. Article intéressant que vous avez creusé, cependant.


3 Réponses :


8
votes

interfaces car les marqueurs ont été largement remplies par le mécanisme d'annotation de Java 5 ou ultérieure. Ils vous permettent d'ajouter des métadonnées arbitraires. Si vos interfaces sont vides et que vous servez uniquement à agir en tant que marqueurs de classe, vous devriez utiliser des annotations à la place.


3 commentaires

Je ne regarde jamais les usages des annotations, bien que je l'utilise dans certains cadres. Merci. Je vais google pour des tutoriels. Pourriez-vous également me transmettre des liens de tutoriel d'annotation si vous vous trouvez à portée de main?


Java.sun.com/j2se/1.5.0/ DOCS / GUIDE / LANGUE / ANNOTATIONS.HTML Le plus grand gotcha à utiliser des annotations est que vous devez annoter vos annotations avec une conservation de «Runtime» si vous souhaitez les utiliser au moment de l'exécution. Par défaut, ils sont jetés par le compilateur.


Un autre gotcha avec des annotations est qu'ils ne sont pas hérités par défaut par les sous-classes. Vous devez spécifier @ hérités ( J2EE .ME / J2SE / 1.5.0 / DOCS / API / Java / Lang / Annotation / Hérité. HTML ) sur l'annotation pour atteindre cette



5
votes

Les annotations ne sont pas nécessairement ce que vous voulez. Les interfaces de marquage sont un moyen de travailler une propriété d'un type dans le type lui-même. Par exemple, si vous êtes sur le point de commencer à écrire du code ressemblant à ceci:

interface ContainableTag {}

public class Foo implements ContainableTag {}

// ... elsewhere...

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


1 commentaires

Haha .. mon "Java efficace" est trop vieux pour avoir cet article. Merci.



7
votes

tandis que les annotations peuvent fournir une alternative à quelles interfaces de marqueur accomplissent, elles ne sont disponibles qu'en Java et ne s'intègrent pas bien aux IDes: j'utilise également des interfaces de marqueur pour baliser des concepts associés dans mon projet, et je peux ensuite utiliser le type Navigateur de hiérarchie Pour trouver tous les membres (je suppose que cela sera finalement pris en charge par des IDs principaux pour les annotations bientôt).

Quant à l'article que vous avez mentionné, je ne vois pas le point de soutenir que si une classe syntaxiquement / structurellement "remplit" une interface, cette interface peut / doit être appliquée automatiquement à la classe ("toute classe peut le déclarer [ Accessoires aléatoires] comme une interface ... "). C'est la pensée en arrière, à mon avis.

Je dirais que les endroits où une telle interface de marqueur est utilisée dans une déclaration `InstanceOf ', utilisez une logique inversée, mais aussi longtemps que vous êtes coincé dans une langue sans héritage multiple, aspects et annotations, je ne vois pas mieux façon d'accomplir cela sans sortir de la langue de base.

Notez également que cet argument de battement de mort sur une interface vide toujours applicable pourrait également être appliqué aux annotations.


0 commentaires