DEV Community

Java Efetivo (livro)
Java Efetivo (livro)

Posted on

2

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

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay