Pergunta

Durante a análise de determinados arquivos XML, me deparo com uma situação que tenho de interface de uso como etiquetas para identificar que certas marcas pertencem a determinada categoria, por exemplo, eu criei um tag interface para identificar que essas classes são usados ??para representar tags XML, e ContainableTag salientar que determinadas marcas pode ser uma das crianças Tags de algumas marcas.

Então eu tropeçar em esta página: http://xahlee.org/java-a -dia / interface.html (por favor, olhar para o " interface como etiquetas " sessão.). Ele diz:

A essência do problema é que é um pedaço de irrelevância matemática em o idioma. Como um mecanismo de rotulagem em uma língua, para a possível beneficiar da engenharia de software perspectiva, então ele não deve ser concebido como parte da Classe Interface, uma vez que o conceito de rotulagem, e o conceito de programação interface, são semanticamente díspares.

Assim é a interface como rótulos necessariamente uma má prática? Como um programador java, temos algumas outras alternativas?

Foi útil?

Solução

Interfaces como marcadores têm sido em grande parte substitui pelo mecanismo de anotação em Java 5 ou posterior. Eles permitem que você adicione meta-dados arbitrários. Se as interfaces estão vazios e só está servindo para atuar como marcadores de classe, então você deve estar usando anotações em seu lugar.

Outras dicas

Enquanto anotações podem fornecer uma alternativa para o que as interfaces marcador realizar, eles só estão disponíveis em Java, e não se integram bem com IDEs: Eu também usar interfaces marcador para conceitos relacionados tag no meu projeto, e então eu posso usar o tipo de navegador hierarquia para encontrar todos os membros (acho que isso vai ser, eventualmente apoiado por grandes IDEs para anotações em breve).

Quanto ao artigo que você mencionou, eu não vejo o ponto na argumentação de que se uma classe sintaticamente / estruturalmente "cumpre" uma interface, essa interface pode / deve ser aplicada automaticamente para a classe ( "Qualquer classe pode declará-lo [ RandomAccess] como uma interface ... "). Isso está para trás a pensar, na minha opinião.

Eu diria que os lugares, onde tal interface de marcador é usado em uma 'declaração `instanceof, use a lógica invertida, mas enquanto você está preso dentro de uma linguagem sem herança múltipla, aspectos e anotações, eu não ver melhor maneira de conseguir isso sem sair da linguagem base.

Além disso, note que este argumento dead-beat sobre uma interface vazia sempre sendo aplicável também poderia ser aplicado às anotações.

As anotações não são necessariamente o que você quer. interfaces de marcação são uma forma de trabalhar a propriedade de um tipo para o próprio tipo. Por exemplo, se você está prestes a começar a escrever código parecido com isto:

@interface ContainableTag{}

@ContainableTag public class Foo {}

// ... elsewhere...

/**
 * Adds obj as a child element.
 * @throws IllegalArgumentException if obj is not tagged with 
 *         the ContainableTag annotation.
 */
public void addElement(Object obj){
    if (!obj.getClass().isAnnotationPresent(ContainableTag.class))
        throw new IllegalArgumentException("obj is not a ContainableTag");
    // add the containable tag as an element
}

Em seguida, considere se você realmente não acho que isso parece melhor:

interface ContainableTag {}

public class Foo implements ContainableTag {}

// ... elsewhere...

public void addElement(ContainableTag ct){
    // add the containable tag as an element
}

Claro, a interface de marcação não fornece qualquer informação sobre o comportamento do tipo em si oferece, mas faz permitir que outros tipos de impor esta propriedade não-comportamental. Eu certamente teria sido poupado um monte de bugs irritantes se ObjectOutputStream tinha um método writeObject(Serializable) em vez de writeObject(Object).

Editar: eu tenho não apoio insignificante aqui.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top