Olá pessoal… estudando a apostila de Java da Caelum, pude descobrir que utilizar herança é extremamente desaconselhado pelos gurus da linguagem Java… Ao invés disso, eles preferem utilizar composição e interfaces… Sou meio que iniciante em Java e não consegui entender direito porque há essa repulsão tão grande em cima da prática da herança… o q vcs podem dizer a respeito? Falow
Usar heranças em java pode ser perigoso?
3 Respostas
Não é uma “repulsão” (a rigor, em português o termo certo é “repulsa”; “repulsão” reserva-se para uma força, como uma “repulsão eletromagnética”) ou uma “aversão”. É uma constatação (e uma recomendação de muitos gurus, como o Joshua Bloch, em seu livro “Effective Java”.
O problema da herança simples é que ela herda não só a interface (conjunto dos métodos de acesso a objetos de uma classe) mas também a implementação (incluindo variáveis e métodos privados), o que torna a implementação suscetível ao problema da “classe base frágil” ( http://en.wikipedia.org/wiki/Fragile_base_class , http://www.cas.mcmaster.ca/~emil/publications/fragile/ecoop98.pdf ).
Além disso, em Java, a herança é limitada a apenas uma classe, para evitar certos problemas que ocorrem em outras linguagens que têm herança múltipla.
É preferivel usar composição que herança.
Herança é É-UM
composição é TEM-UM
No caso da herança, ocorre um maior acoplamento com a superclasse.
Neste caso a manutenção é mais problemática, pois qualquer alteração
nos métodos da superclasse, influência diretamente a subclasse.
Em composição a classe tem uma referência a classe contida, de certa forma,
se bem usado com interfaces, ocasiona menos acoplamento entre as classes.
Um exemplo chato de herança que foi feita somente por causa da implementação é a classe java.util.Properties.
Ela herda da classe java.util.Hashtable (em vez de simplesmente implementar java.util.Map); isso trouxe, como efeito colateral, o fato de que você não pode trocar o Hashtable que ela tem por algo mais prático (como um LinkedHashMap, que além de ser rápido como a Hashtable original, preservaria a ordem das linhas do arquivo .properties.
Para você poder herdar de java.util.Properties e usar uma estrutura de dados melhor, você teria de simplesmente reimplementar todos os métodos de java.util.Properties para redirecionar para uma estrutura de dados melhor, e ainda por cima ficar com uma java.util.Hashtable sem uso dentro da implementação nova. É chato (digo isso porque já fiz exatamente isso: reimplementei java.util.Properties, derivando uma nova classe a partir dela, para que ela pudesse preservar a ordem das linhas e não desprezar os comentários).