Método padrão e herança múltipla no Java 8

A versão 8 do Java veio com muitas novidades, algumas bem polêmicas, e uma delas é o método padrão. Além de o seu próprio conceito gerar bastante confusão, ele gera outra confusão ainda maior que não existia antes no Java: herança múltipla.

Neste artigo vou explicar o que é esse método padrão e suas implicações.

Interface ou método abstrato?

Você poderia fazer isso no Java:

default_method_1

Você pode pensar que a interface e a classe abstrata no exemplo acima são a mesma coisa, pois há um método que, para ser utilizado, outra classe terá que implementá-lo. Porém, há algumas diferenças entre eles:

  • Uma classe pode implementar múltiplas interfaces, mas só pode herdar de uma classe, seja abstrata ou não.
  • A classe abstrata pode conter métodos não abstratos, com implementação, já a interface não pode.
  • Uma classe abstrata pode conter um método abstrato que é protegido ou uma variável (atributo) privado ou protegido, já na interface tudo é obrigatoriamente público.

Sabendo disso, fica mais fácil tomar algumas decisões na escolha entre interface e classe abstrata. Só que no Java 8, houve a inclusão do método padrão.

Método padrão

O método padrão (default method) foi adicionado na versão 8 do Java e é demonstrado no exemplo abaixo:

default_method_2

É isso mesmo o que você viu: agora você pode implementar métodos dentro de uma interface, bastando adicionar o modificador default no método.

Isto é uma funcionalidade que não afeta os códigos já existentes, mesmo em versões anteriores do Java, mas as pessoas vão acabar utilizando este recurso e você precisará lidar com algo novo no mundo do Java:

Herança Múltipla

Lembra que eu mencionei que uma classe pode implementar mais de uma interface? Então veja só este exemplo:

default_method_3

Se eu quiser criar uma classe que implemente essas duas interfaces, sendo que os dois métodos possuem a mesma assinatura em ambas interfaces, o que você acha que pode acontecer?

Veja a resposta:

default_method_4

O compilador não aceita essa situação, simplesmente gera um erro.

Para resolver esta situação, você é obrigado a sobrescrever o método. Para não ter que rescrever o código, você pode chamar um dos métodos sobrescrito:

default_method_5

Conclusão

Mesmo lendo a documentação da Oracle e alguns artigos pela internet, ainda não enxerguei uma vantagem real nesse recurso, mas ainda é cedo para levantar qualquer bandeira.

O mais importante é que os desenvolvedores Java analisem bem a situação antes de sair usando este recurso por todo o código.

E você, o que acha desse novo recurso? Já usou e pretende usá-lo?

 

2 comentários em “Método padrão e herança múltipla no Java 8


  1. Bazilio disse:

    Maneiro Nardini! É estranho ver uma interface com implementação, né?! Rs
    Trocamos uma idéia sobre isso ai…isso ai foi uma saida pra permitir evoluir algumas classes do java sem quebrar a retrocompatibilidade. :)

    • Bruno Nardini disse:

      Foi esse motivo mesmo que está na documentação da Oracle. Mas uma refatoração em um sistema protegido por testes não seria suficiente? Uma programação orientada a interface e não a implementação não já prevê essas mudanças? São questões que valem ser discutidas com certeza.

Deixe um comentário