Qual é o uso de interfaces de marcadores em Java?

Quando não há nada para implementar nas interfaces do marcador, como Serializable. . Qual é a utilidade de implementá-lo?

Nas versões anteriores do Java, as Interfaces Marcas eram a única maneira de declarar metadados sobre uma class. Por exemplo, a Interface de Marcador Serializável permite que o autor de uma class diga que sua class se comportará corretamente quando serializada e desserializada.

No Java moderno, as interfaces dos marcadores não têm lugar. Eles podem ser completamente substituídos por Anotações , que permitem uma capacidade de metadados muito flexível. Se você tiver informações sobre uma class e essas informações nunca mudarem, as annotations serão uma maneira muito útil de representá-las.

Joshua Bloch: Java eficaz 2a edição, p 179

Item 37: Use interfaces de marcador para definir tipos

… Você pode ouvir que as annotations do marcador (Item 35) tornam as interfaces do marcador obsoletas. Esta afirmação está incorreta. Interfaces de marcadores têm duas vantagens sobre annotations de marcadores. Em primeiro lugar, as interfaces de marcadores definem um tipo que é implementado por instâncias da class marcada; annotations de marcador não. A existência deste tipo permite que você capture erros em tempo de compilation que você não conseguiria capturar até o tempo de execução se você usasse uma anotação de marcador ….

Pessoalmente, acho que vou me curvar ao conhecimento superior de Joshua sobre esse assunto.

Tais interfaces de marcadores são úteis no caso de outros códigos tomarem decisões dependendo se um object implementa alguma interface de marcadores.

No caso de Serializable , a reflection será usada para serializar os campos dos objects.

Agora, as annotations são preferidas, pois não se propagam para subclasss.

Veja o padrão de interface do marcador .

Isso indica que a class (e, consequentemente, todos os campos que não são temporários) são candidatos à serialização. E se você está construindo um framework dependente de serialização, é claro que você pode escrever um método assim:

 public void registerObject(Serializable obj); 

para limitar as classs que você está preparado para aceitar.

Como um object serializado precisa manter a compatibilidade entre sistemas, a serialização é uma decisão de design explícita e, portanto, requer o uso da interface do marcador para identificar tais candidatos.

Há também um aspecto de segurança. Você não quer tornar tudo serializável – caso contrário, você pode expor acidentalmente (digamos) senhas ou outros dados confidenciais via serialização.

Se você implementar uma interface, o instanceof será verdadeiro. Se a interface não tiver nada para implementar, você poderá usar isso para marcar uma class com metadados, como as annotations, para o Java 1.5 e superior, sem precisar forçar o implementador a fazer algo especial.

Eles são chamados de interfaces de marcadores . E como o nome indica, eles indicam que algum object está disponível para certos tipos de operações.

Serializable significa que o object é elegível para serialização de java, por exemplo.

Foi discutido se eles não devem ser substituídos por annotations, uma vez que suas funções são bastante semelhantes.

Você está certo em raciocinar que uma interface vazia não afeta a execução “padrão” do programa, que é baseada na inspeção / mutação de campos e despacho de methods.

Entretanto, a interface do marcador é útil quando usada em conjunto com a reflection: Uma biblioteca / método inspeciona (via reflection) um object e funciona de maneira diferente se a sua class implementar a interface do marcador. A partir do Java5, há muito pouca necessidade de interfaces com marcadores – o mesmo recurso de “marcação” pode ser obtido por meio de annotations Java – que (novamente) a maior parte de seu efeito será obtida por meio de um código baseado em reflection.

O objective principal é dizer ao compilador que trata diferentemente o object da class que implementou a interface do marcador.

Analisando cuidadosamente a interface do marcador em Java, por exemplo, Serializable, Clonnable e Remote, parece que eles são usados ​​para indicar algo ao compilador ou à JVM. Portanto, se a JVM enxergar uma Classe como Serializável, ela executará alguma operação especial, de maneira semelhante, se a JVM considerar que uma Classe é implementar Clonnable, executará alguma operação para suportar a clonagem. O mesmo é verdadeiro para a interface RMI e Remote. Então, em suma Marker indicar interface, sinal ou um comando para o compilador ou JVM.

Leia mais: http://javarevisited.blogspot.com/2012/01/what-is-marker-interfaces-in-java-and.html#ixzz2v6fIh1rw

Intereting Posts