DEV Community

Java Efetivo (livro)
Java Efetivo (livro)

Posted on

Item 41: Use as interfaces marcadoras para definir tipos

Definição e Propósito

Interface Marcadora:

  • Não contém declarações de métodos.
  • Marca uma classe como tendo uma propriedade específica.
  • Exemplo: Serializable indica que uma classe pode ser serializada.
  • Vantagens das Interfaces Marcadoras

Definição de Tipo:

  • Interfaces marcadoras definem um tipo que as instâncias de uma classe implementam.
  • Permite detecção de erros em tempo de compilação.

Exemplo:

public class MyClass implements Serializable {
    // Implementação
}
Enter fullscreen mode Exit fullscreen mode

Verificação em Tempo de Compilação:

  • O uso de interfaces marcadoras permite que erros sejam detectados durante a compilação.

Exemplo com Serializable:

ObjectOutputStream.writeObject(myObject); // Garante que myObject seja Serializable
Enter fullscreen mode Exit fullscreen mode

Precisão na Marcação:

  • Interfaces marcadoras podem ser aplicadas com precisão a subtipos específicos.

Exemplo:

public interface MyMarkerInterface extends MySpecificInterface {
    // Sem métodos adicionais
}
Enter fullscreen mode Exit fullscreen mode

Exemplos de Uso

Serializable:

  • Indica que uma classe pode ser serializada.

Exemplo:

public class Person implements Serializable {
    private String name;
    private int age;
    // Getters, setters, etc.
}

Enter fullscreen mode Exit fullscreen mode

Interface Set como Marcadora Restrita:

  • Aplica-se apenas a subtipos de Collection, mas não adiciona métodos além dos definidos por Collection.
  • Refina contratos de métodos como add, equals e hashCode.
  • Comparação com Anotações Marcadoras

Anotações Marcadoras:

  • Podem ser aplicadas a mais elementos do programa (classes, interfaces, métodos, etc.).

Exemplo:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyMarkerAnnotation {
}

@MyMarkerAnnotation
public class MyClass {
    // Implementação
}

Enter fullscreen mode Exit fullscreen mode

Quando usar Interface Marcadora vs. Anotação Marcadora:

  • Use interface marcadora se:
  • A marcação deve definir um tipo.
  • Pode querer escrever métodos que aceitem apenas objetos com essa marcação.

Use anotação marcadora se:

  • A marca se aplica a elementos que não sejam classes ou interfaces.
  • Faz parte de um framework que usa intensamente anotações.

Vantagens das Anotações Marcadoras

  • Consistência em Frameworks:
  • Facilita a consistência em frameworks baseados em anotações.

Exemplo:

@MyFrameworkAnnotation
public class MyClass {
    // Implementação
}
Enter fullscreen mode Exit fullscreen mode

Decisão de Uso
Para definir um tipo:

  • Use uma interface marcadora.
  • Para marcar elementos que não sejam classes ou interfaces:
  • Use uma anotação marcadora.

Parte de um framework baseado em anotações:
Use uma anotação marcadora.

Exemplo Final

  • Interface Marcadora:
public interface MyTypeMarker {
}

public class MyClass implements MyTypeMarker {
    // Implementação
}

public void process(MyTypeMarker obj) {
    // Processa apenas objetos marcados com MyTypeMarker
}

Enter fullscreen mode Exit fullscreen mode

Anotação Marcadora:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyAnnotationMarker {
}

@MyAnnotationMarker
public class MyClass {
    // Implementação
}

Enter fullscreen mode Exit fullscreen mode

Resumo

  • Interfaces marcadoras são usadas para definir tipos sem métodos adicionais.
  • Anotações marcadoras são usadas para marcar elementos de programa de forma ampla.
  • A escolha depende do contexto e do objetivo da marcação.

Complemento
Interfaces marcadoras:
Image description

Top comments (0)