Me enseñaron que la interfaz Marker en Java es una interfaz vacía y se utiliza para indicar al compilador o JVM que los objetos de la clase que implementan esta interfaz deben tratarse de una manera especial, como la serialización, la clonación, etc.
Pero últimamente he aprendido que en realidad no tiene nada que ver con el compilador o la JVM. Por ejemplo, en el caso de Serializable
la interfaz del método writeObject(Object)
de ObjectOutputStream
hace algo como instanceOf Serializable
para detectar si las implementa la clase Serializable
y lanza NotSerializableException
en consecuencia. Todo se maneja en el código y esto parece ser un patrón de diseño, por lo que creo que podemos definir nuestras propias interfaces de marcador.
Ahora mis dudas:
¿Es incorrecta la definición de una interfaz de marcador mencionada anteriormente en el primer punto? ¿Cómo podemos definir una interfaz de marcador entonces?
Y en lugar de usar el
instanceOf
operador, ¿por qué el método no puede ser algowriteObject(Serializable)
así como para que haya una verificación de tipo en tiempo de compilación en lugar de tiempo de ejecución?¿Cómo son las anotaciones mejores que las interfaces de marcador?
Serializable
como una anotación no tiene sentido y@NonNull
como una interfaz no tiene sentido. Yo diría: las anotaciones son marcadores + metadatos. Por cierto: Forefunner of Annotations fue XDoclet, nacido en Javadoc, asesinado por Annotations.