10
votes

Marquage des interfaces en Java

Quelles sont les interfaces de marquage et que sont-ils utilisés?


0 commentaires

8 Réponses :


1
votes

Il a été utilisé pour mentionner certaines biens d'une classe (comme des spectacles sérialisables, que la classe est autorisée à sérialiser). Maintenant, les annotations pourraient faire ce travail.


2 commentaires

@skaffman: Est-ce quelque chose d'autre qu'il est plus difficile de rechercher une annotation qu'une interface qui vous fait dire que les annotations ne sont pas un remplacement des interfaces de marqueur '?


On peut annoter le code autre que les classes. On peut également utiliser des annotations avec des arguments. Prenez le JSR 305 @scriptassert Annotation de validation, par exemple.



6
votes

Une interface de marquage a généralement une magie associée à celle-ci: soit directement intégrée à la machine virtuelle, ou à l'aide de la réflexion. Parce que la magie pourrait techniquement s'appliquer à n'importe quelle classe, vous utilisez le marquage pour indiquer que vous avez bien pensé à la magie et que cela s'applique à votre classe.


1 commentaires

Est-ce? Il me semble que l'extension d'une interface de marquage peut fournir une vérification de type au moment de la compilation pour des méthodes qui n'acceptent que des objets dont le type est une extension de l'interface de marquage. Regardez l'événementListenerlist.Ajouter, par exemple.



5
votes

La question des interfaces de marqueurs vs annotations est discutée dans "Java efficace" de Bloch, et une partie de cette section est disponible sur Google Books


1 commentaires

+1 - Bloch, comme d'habitude, résume joliment et répond à mon commentaire / question sur la réponse de @ mnementh.



0
votes

En plus des autres réponses, les interfaces de marqueur peuvent également être utilisées pour spécifier des propriétés supplémentaires d'une classe qui n'est pas héritée par une autre interface déjà mise en œuvre. Un exemple de ce serait l'interface RandomAccess . Il désigne une collection qui peut être accessible au hasard sans perte de performance et ne doit pas être accessible via un itérateur pour atteindre cette performance.


0 commentaires

0
votes

Vous pouvez marquer votre classe avec une interface de marquage pour dire à votre collègue développeur et à votre consommateur de votre classe que vous appuyez explicitement cette fonctionnalité. Pensez à Serializable; Quelqu'un qui doit persister une session et utilise la sérialisation pour le faire peut utiliser en toute sécurité un objet de votre classe.

Il peut être utilisé plus avant en réflexion; De nos jours, il est courant d'utiliser des annotations pour le faire, mais dans les jours olden, vous pouvez inspecter une classe, vérifier si elle implémente une certaine interface (comme DAO) et, dans l'affirmative, traiter l'objet plus loin (je pense à l'annotation de l'entité ici ).


0 commentaires

5
votes

Parce que parfois, il est vraiment logique que certains biens d'un type peuvent être utilisés comme type lui-même - sérialisable se vient à l'esprit. Si je fais une méthode comme celle-ci: xxx

... Vous ne savez pas vraiment comment ce Data sera enregistré. VM sérialisation? La sérialisation de la propriété de haricot? Quelques schéma homebillés? Alors que si vous l'écrivez comme ceci comme suit: xxx

... Il est assez clair (si seul le concepteur de ObjectOutPutStream avait utilisé cette possibilité!) . Parfois, il est logique d'utiliser des annotations lorsque vous souhaitez ajouter des méta-données aux types, mais dans ce cas, je discuterais d'une interface de marquage.


0 commentaires

0
votes

Les interfaces de marquage sont des interfaces sans méthodes abstraites à l'intérieur, elles sont utilisées pour ajouter un type de données pour la classe qui les implique et d'être une interface parent pour d'autres interfaces (en particulier avec des interfaces multiples) xxx

** Lorsque JVM voit l'interface de nom, il découvrira que la démonstration exercera un CENario spécifique.


0 commentaires

0
votes

J'ajouterais également que vous pouvez utiliser des interfaces de marquage pour limiter la propriété d'une instance:

interface IFlumThing;
interface IFlooThing;

class BaseThing {...}

class FlumThing extends BaseThing implements IFlumThing {};
class FlooThing extends BaseThing implements IFlooThing {};

class Flum {
   addThing(IFlumThing thing){...};
}

class Floo {
   addThing(IFlooThing thing){...};
}


0 commentaires