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 Serializableda interface do método writeObject(Object)de ObjectOutputStreamfaz algo parecido instanceOf Serializablepara detectar se os implementos classe Serializablee mantas NotSerializableExceptionem 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
instanceOfoperador, 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?
Serializablecomo uma anotação não faz sentido e@NonNullcomo 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.