Lorsqu'il n'y a rien à implémenter dans les interfaces de marqueur comme Serializable. . à quoi sert sa mise en œuvre?
Dans les versions antérieures de Java, Marker Interfaces était le seul moyen de déclarer des métadonnées sur une classe. Par exemple, l'interface de marqueur sérialisable permet à l'auteur d'une classe de dire que sa classe se comportera correctement lorsqu'elle sera sérialisée et désérialisée.
Dans Java moderne, les interfaces de marqueur n'ont pas leur place. Ils peuvent être complètement remplacés par Annotations , qui permettent une capacité de métadonnées très flexible. Si vous avez des informations sur une classe et que ces informations ne changent jamais, les annotations sont un moyen très utile de la représenter.
Joshua Bloch: efficace Java 2e édition, p 179
Item 37: Utiliser des interfaces de marqueur pour définir les types
... Vous pouvez l'entendre dire que les annotations de marqueur (point 35) rendent les interfaces de marqueur obsolètes. Cette affirmation est incorrecte. Les interfaces de marqueur ont deux avantages par rapport aux annotations de marqueur. Tout d'abord, les interfaces de marqueur définissent un type qui est implémenté par les instances de la classe marquée; les annotations de marqueur ne le font pas. L'existence de ce type vous permet de détecter des erreurs lors de la compilation que vous ne pourriez pas détecter jusqu'à l'exécution si vous utilisiez une annotation de marqueur ....
Personnellement, je pense que je m'inclinerai devant les connaissances supérieures de Joshua à ce sujet.
Ces interfaces de marqueur sont utiles dans le cas où un autre code prend des décisions selon qu'un objet implémente une interface de marqueur.
Dans le cas de Serializable
, la réflexion sera utilisée pour sérialiser les champs des objets.
Maintenant, les annotations sont préférées car elles ne se propagent pas aux sous-classes.
Cela indique que la classe (et par conséquent tous les champs qui ne sont pas transitoires) sont candidats à la sérialisation. Et si vous construisez un framework dépendant de la sérialisation, vous pouvez bien sûr écrire une méthode ainsi:
public void registerObject(Serializable obj);
pour limiter les cours que vous êtes prêt à accepter.
Étant donné qu'un objet sérialisé doit conserver la compatibilité entre les systèmes, la sérialisation est un décision de conception explicite et nécessite donc l'utilisation de l'interface de marqueur pour identifier de tels candidats.
Il y a aussi un aspect sécurité. Vous ne voulez pas que tout soit sérialisable - sinon vous pouvez accidentellement (par exemple) exposer des mots de passe ou d'autres données sensibles via la sérialisation.
Ils sont appelés interfaces marker. Et comme son nom l'indique, ils marque qu'un objet est disponible pour certains types d'opérations.
Serializable
signifie que l'objet est éligible pour Java sérialisation, par exemple.
Il a été discuté s'ils ne devraient pas être remplacés par des annotations, car leurs fonctions sont assez similaires.
Si vous implémentez une interface, instanceof
sera vrai. Si votre interface n'a rien à implémenter, vous pouvez l'utiliser pour marquer une classe avec des métadonnées comme les annotations pour Java 1.5 et plus sans avoir à forcer l'implémenteur à faire quelque chose de spécial.
Vous avez raison de penser qu'une interface vide n'affecte pas l'exécution "standard" du programme qui est basée sur l'inspection/la mutation des champs et la répartition des méthodes.
Cependant, l'interface marqueur est utile lorsqu'elle est utilisée conjointement avec la réflexion: une bibliothèque/méthode inspecte (via la réflexion) un objet et fonctionne différemment si sa classe applique l'interface marqueur. Depuis Java5, il n'y a que très peu besoin d'interfaces de marqueurs - la même fonction de "marquage" peut être obtenue via des annotations Java - qui (encore) la plupart de leurs effets seront obtenus via du code basé sur la réflexion.