Usar heranças em java pode ser perigoso?

3 respostas
K

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

3 Respostas

T

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.

sandeco

É 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.

T

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).

Criado 22 de abril de 2009
Ultima resposta 23 de abr. de 2009
Respostas 3
Participantes 3