No Java 8, as interfaces podem conter métodos implementados, métodos estáticos e os chamados métodos "padrão" (que as classes de implementação não precisam substituir).
Na minha opinião (provavelmente ingênua), não havia necessidade de violar interfaces como essa. As interfaces sempre foram um contrato que você deve cumprir, e esse é um conceito muito simples e puro. Agora é uma mistura de várias coisas. Na minha opinião:
- métodos estáticos não pertencem a interfaces. Eles pertencem a classes de utilidade.
- Os métodos "padrão" não deveriam ter sido permitidos nas interfaces. Você sempre pode usar uma classe abstrata para esse fim.
Em resumo:
Antes do Java 8:
- Você pode usar classes abstratas e regulares para fornecer métodos estáticos e padrão. O papel das interfaces é claro.
- Todos os métodos em uma interface devem ser substituídos pela implementação de classes.
- Você não pode adicionar um novo método em uma interface sem modificar todas as implementações, mas isso é realmente uma coisa boa.
Após o Java 8:
- Praticamente não há diferença entre uma interface e uma classe abstrata (exceto herança múltipla). De fato, você pode emular uma classe regular com uma interface.
- Ao programar as implementações, os programadores podem esquecer de substituir os métodos padrão.
- Há um erro de compilação se uma classe tentar implementar duas ou mais interfaces com um método padrão com a mesma assinatura.
- Ao adicionar um método padrão a uma interface, toda classe de implementação herda automaticamente esse comportamento. Algumas dessas classes podem não ter sido projetadas com essa nova funcionalidade em mente, e isso pode causar problemas. Por exemplo, se alguém adicionar um novo método padrão
default void foo()
a uma interfaceIx
, a classeCx
implementandoIx
e tendo umfoo
método privado com a mesma assinatura não será compilada.
Quais são as principais razões para essas mudanças importantes e que novos benefícios (se houver) eles acrescentam?
@Deprecated
categoria! métodos estáticos são uma das construções mais abusadas em Java, devido à ignorância e preguiça. Muitos métodos estáticos geralmente significam programadores incompetentes, aumentam o acoplamento em várias ordens de magnitude e são um pesadelo para testar e refatorar a unidade quando você percebe por que é uma má ideia!