Item 41: Use as interfaces marcadoras para definir tipos
Tags: java, javaprogramming
Published: 2024-07-11 19:50:46

**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
}
```

**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
```

**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
}
```

**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.
}

```

**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
}

```
**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
}
```

**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
}

```

Anotação Marcadora:

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

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

```
**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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pbydn87we44vrk4v8g3n.jpg)