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 Serializablela interfaz del método writeObject(Object)de ObjectOutputStreamhace algo como instanceOf Serializablepara detectar si las implementa la clase Serializabley lanza NotSerializableExceptionen 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
instanceOfoperador, ¿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?
Serializablecomo una anotación no tiene sentido y@NonNullcomo 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.