Map - AbstractMap - HashMap [OOP]

7 respostas
adolfo_eloy

Olá Pessoal.

Tenho uma dúvida a respeito da modelagem das classes,
Map, AbstractMap e HashMap.

Conforme a documentação da Sun que encontrei (api jse1.5),
Map é uma interface, onde as Classes AbstractMap e HashMap, a implementam.
Porém, além de HashMap implementar Map, a classe HashMap também
faz extensão da classe AbstractMap (que tbem implementa Map).

Qual a vantagem desta estrutura? Porque desta estrutura?
Porque HashMap não herda AbstractMap apenas, e o método que quiser
implementar, não sobrescreve?

Obrigado. :shock:

Abs

7 Respostas

velo

AbstractMap eh extendida por meio mundo.

Usa-se as interfaces no lugar do das classes pra diminuir o aclocamento…

Assim, se eu quizer, posso criar uma classe ArrayMap que se vale de arrays para gerenciar o mapa, vou implementar map, mas não vou extender de abstract map.

Na real, o AbstractMap é qm tá sobrando. Ele só está onde está pra aproveitar codigo, pode ver, uma galera extende desse cara!

VELO

1112

Hn, acho que entendi a pergunta do Adolfo. Se uma classe abstrata A implementa uma interface B, uma classe C que herde de A não precisaria implementar B, pois já está implementando indiretamente a partir de A. Assim, o HashMap não precisaria implementar Map diretamente.

Talvez esteja assim para o código ficar mais claro, ou para mudar alguma coisa no javadoc gerado. Ou pode ser um “erro” mesmo. Mas que é desnecessário, é.

T

Ora, HashMap herda de AbstractMap, e por conseguinte implementa Map (isso porque AbstractMap implementa Map).
Por que é que você está reclamando?
Não seria possível fazer de outra forma.
(Não é como no C++, onde você pode herdar de 2 classes distintas, mas tornar uma herança pública e outra herança privada. )

T

Basta você ver o javadoc de LinkedHashMap.

http://java.sun.com/j2se/1.5.0/docs/api/java/util/LinkedHashMap.html

Essa classe herda de HashMap, e por conseguinte implementa Map (e outras interfaces que a classe-pai implementa, como Serializable e Cloneable).

Portanto: se uma subclasse herda de uma superclasse, implementa as interfaces que foram implementadas pela superclasse. É simples assim.

É que no JavaDoc isso é explicitado, e na verdade é melhor que seja explícito mesmo, para facilitar.

1112

No caso do HashMap, não é só no Javadoc, Thingol, no fonte também está explícito.

adolfo_eloy

Realmente. A Impressão que eu tive é de que a Classe HashMap está querendo implementar uma classe que já é implementada pela classe que HashMap extende (AbstractMap - e que ja implementa Map).

Obrigado pessoal.

sergiotaborda

adolfo_eloy:
Olá Pessoal.

Tenho uma dúvida a respeito da modelagem das classes,
Map, AbstractMap e HashMap.

Conforme a documentação da Sun que encontrei (api jse1.5),
Map é uma interface, onde as Classes AbstractMap e HashMap, a implementam.
Porém, além de HashMap implementar Map, a classe HashMap também
faz extensão da classe AbstractMap (que tbem implementa Map).

Qual a vantagem desta estrutura? Porque desta estrutura?
Porque HashMap não herda AbstractMap apenas, e o método que quiser
implementar, não sobrescreve?

HashMap implementa Map porque herda de AbstractMap que implementa Map. A razão disto é o design pattern Template Method. AbstractMap implementa todo o codigo reutilizável entre os diversos Map. Cada um depois so muda o que lhe interessa.

Criado 26 de fevereiro de 2007
Ultima resposta 27 de fev. de 2007
Respostas 7
Participantes 5