Eu estava aprendendo que a interface Marker em Java é uma interface vazia e é usada para sinalizar ao compilador ou JVM que os objetos da classe que implementam essa interface devem ser tratados de uma maneira especial, como serialização, clonagem etc.
Mas ultimamente eu aprendi que ele realmente não tem nada a ver com o compilador ou a JVM. Por exemplo, no caso Serializable
da interface do método writeObject(Object)
de ObjectOutputStream
faz algo parecido instanceOf Serializable
para detectar se os implementos classe Serializable
e mantas NotSerializableException
em conformidade. Tudo é tratado no código e isso parece ser um padrão de design, então acho que podemos definir nossas próprias interfaces de marcador.
Agora minhas dúvidas:
A definição de uma interface de marcador mencionada acima no 1º ponto está errada? Como podemos definir uma interface de marcador então?
E, em vez de usar o
instanceOf
operador, por que o método não pode ser algo parecidowriteObject(Serializable)
para que haja uma verificação do tipo em tempo de compilação em vez do tempo de execução?Como as anotações são melhores que as interfaces de marcador?
Serializable
como uma anotação não faz sentido e@NonNull
como uma interface não faz sentido. Eu diria: Anotações são marcadores + metadados. BTW: O Forefunner of Annotations foi o XDoclet, nascido em Javadoc, morto por Annotations.