Quelles sont les interfaces de marquage et que sont-ils utilisés? P>
8 Réponses :
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. P>
@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 code> Annotation de validation, par exemple.
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. P>
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.
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 A >. 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. P>
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. p>
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 ). p>
Parce que parfois, il est vraiment logique que certains biens d'un type peuvent être utilisés comme type lui-même - ... Vous ne savez pas vraiment comment ce ... Il est assez clair (si seul le concepteur de sérialisable code> se vient à l'esprit. Si je fais une méthode comme celle-ci: Data code> 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: p> ObjectOutPutStream code> 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. P> p>
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) ** Lorsque JVM voit l'interface de nom, il découvrira que la démonstration exercera un CENario spécifique. p> p>
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){...};
}