On m'a appris que l'interface Marker en Java est une interface vide et est utilisée pour signaler au compilateur ou à la JVM que les objets de la classe implémentant cette interface doivent être traités d'une manière spéciale, comme la sérialisation, le clonage, etc.
Mais dernièrement, j'ai appris que cela n'avait en fait rien à voir avec le compilateur ou la JVM. Par exemple, dans le cas de l' Serializable
interface, la méthode writeObject(Object)
de ObjectOutputStream
fait quelque chose comme instanceOf Serializable
pour détecter si la classe implémente Serializable
& lance en NotSerializableException
conséquence. Tout est géré dans le code et cela semble être un modèle de conception, donc je pense que nous pouvons définir nos propres interfaces de marqueurs.
Maintenant mes doutes:
La définition d'une interface de marqueur mentionnée ci-dessus au 1er point est-elle fausse? Comment définir alors une interface Marker?
Et au lieu d'utiliser l'
instanceOf
opérateur, pourquoi la méthode ne peut-elle pas être quelque chose comme celawriteObject(Serializable)
afin qu'il y ait une vérification de type au moment de la compilation plutôt que l'exécution?En quoi les annotations sont-elles meilleures que les interfaces de marqueurs?
Serializable
comme une annotation est un non-sens et@NonNull
comme une interface est un non-sens. Je dirais: les annotations sont des marqueurs + des métadonnées. BTW: Forefunner of Annotations était XDoclet, né à Javadoc, tué par des annotations.