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