DEV Community

Java Efetivo (livro)
Java Efetivo (livro)

Posted on

Reflexão sobre itens 22 e 41 do livro

Vamos abordar a aparente contradição entre os itens 22 e 41 do livro:

Item 22: “Se você não quer definir um tipo, não use uma interface.”

Esse item sugere que você não deve usar interfaces para coisas que não representam um tipo real ou uma funcionalidade concreta. Por exemplo, usar uma interface apenas para armazenar constantes não é uma boa prática. Interfaces devem ser usadas para definir contratos ou comportamentos que as classes devem implementar.

Item 41: “Se você quer de fato definir um tipo, use uma interface.”

Esse item fala sobre usar interfaces, especificamente interfaces marcadoras, para definir um tipo que categoriza ou marca classes de uma maneira que pode ser verificada em tempo de compilação. Uma interface marcadora não define métodos, mas ainda assim, define um tipo lógico que pode ser usado para verificar o comportamento das classes em tempo de compilação.

Conciliando os Itens

A chave para entender ambos os itens é a diferença entre definir um tipo útil e usar uma interface de maneira apropriada.

  • Item 22 diz para evitar o uso de interfaces para coisas que não têm uma funcionalidade ou comportamento específico associado a elas. A ideia é que interfaces devem ser usadas para definir contratos claros que as classes devem seguir.

  • Item 41 recomenda o uso de interfaces (inclusive marcadoras) quando você quer definir um tipo que categoriza ou marca classes para um propósito específico e que pode ser usado para verificação em tempo de compilação.

Aplicação Prática
Item 22: Evite isso:

public interface Constants {
    String SOME_CONSTANT = "value";
    int ANOTHER_CONSTANT = 42;
}
Enter fullscreen mode Exit fullscreen mode

Isso não define um tipo ou comportamento; é apenas um contêiner de constantes, o que é um mau uso de uma interface.

Item 41: Use interfaces para marcar um tipo:

public interface PhysicalProduct {
    // Interface marcadora sem métodos
}

public class Book implements PhysicalProduct {
    // Implementação da classe que indica que é um produto físico
}

Enter fullscreen mode Exit fullscreen mode

Aqui, a interface PhysicalProduct define um tipo lógico que pode ser verificado e utilizado para fins específicos, como o cálculo de frete, garantindo que apenas produtos físicos sejam considerados.

Conclusão
Ambos os itens se complementam ao guiar sobre como e quando usar interfaces apropriadamente. A premissa é que interfaces devem ser usadas para definir tipos significativos e contratos claros, seja através de métodos que definem comportamentos ou como marcadores que categorizam classes de maneira lógica e útil.

Top comments (0)