Duvida com HashMap

5 respostas
S

Olá pessoal, por favor me ajudem, já procurei muito sobre essa dúvida e não consigo achar

Eu tenho uma HashMap criada em uma classe RepositorioProdutos:

public class RepositorioProdutos {
	Map<String, Produto> produtos = new HashMap<>();
}

E eu tenho uma classe Gerente que tem um objeto de RepositorioProdutos e salva objetos nessa HashMap:

public class Gerente{

	RepositorioProdutos rprodutos = new RepositorioProdutos();

        public void adicionarProduto(){		
	         Dvd dvd = new Dvd();
                 rprodutos.addProduto(dvd);
        }
}

Ai vem a dúvida. Eu tenho uma outra classe que precisa acessar essa mesma HashMap que o gerente ta usando, e não consigo fazer isso. Não posso somente instanciar um novo objeto de RepositorioProdutos pois ele criaria outra HashMap vazia e eu preciso dos dados da HashMap instanciada por gerente.

Alguém me ajuda?

5 Respostas

felipe_gdr

Crie um método get na classe RepositorioProdutos

public Map<String, Produto> getProdutos() {
     return produtos;
}

e depois chame esse método da classe Gerente

rprodutos.getProdutos().add(dvd);

ou então crie um método específico para adicionar produtos na classe RepositorioProdutos

public adicionaProduto(String chave, Produto produto) {
     produtos.put(chave, produto);
}
ECO2004
sergiofff:
Olá pessoal, por favor me ajudem, já procurei muito sobre essa dúvida e não consigo achar

Eu tenho uma HashMap criada em uma classe RepositorioProdutos:

public class RepositorioProdutos {
	Map<String, Produto> produtos = new HashMap<>();
}

E eu tenho uma classe Gerente que tem um objeto de RepositorioProdutos e salva objetos nessa HashMap:

public class Gerente{

	RepositorioProdutos rprodutos = new RepositorioProdutos();

        public void adicionarProduto(){		
	         Dvd dvd = new Dvd();
                 rprodutos.addProduto(dvd);
        }
}

Ai vem a dúvida. Eu tenho uma outra classe que precisa acessar essa mesma HashMap que o gerente ta usando, e não consigo fazer isso. Não posso somente instanciar um novo objeto de RepositorioProdutos pois ele criaria outra HashMap vazia e eu preciso dos dados da HashMap instanciada por gerente.

Alguém me ajuda?

Deixe eu ver se entendi. Você deseja acessar a HashMap de classes distintas de onde ela foi declarada, correto? Você ainda deseja ter apenas uma instância dessa HashMap, correto?

Você pode fazer o seguinte. Coloque a variável HashMap e a sua instanciação como static. Assim, independentemente de quantos objetos estejam na memória, haverá sempre somente 1 HashMap.

static Map<String, Produto> produtos = new HashMap<>();

Para acessá-la, utilize o comando em qualquer classe no mesmo pacote:

RepositorioProdutos.produtos.método(...)
clunsde

Olá Sergio,

de acordo com as boas práticas de OO, você poderia resolver este problema da seguinte maneira, ao invés de instanciar o RepositorioProdutos na classe Gerente, o que torna essa classe altamente acoplada, você faz a classe Gerente receber o RepositorioProdutos

public class RepositorioProdutos {  
    private Map<String, Produto> produtos;

    public RepositorioProdutos (){
        this.produtos = new HashMap<>(); 
    }

    public void adicionaProduto(String key, Produto produto){ ... }
}

public class Gerente{

   private RepositorioProdutos  rp;

   public Gerente(RepositorioProdutos  rp){
       this.rp = rp;
   }
}

public class OutraClasseSua{
   private RepositorioProdutos  rp;

   public OutraClasseSua(RepositorioProdutos  rp){
       this.rp = rp;
   }
}

public class Programa{
 
   public static void main(String[] args) {
     RepositorioProdutos rp = new RepositorioProdutos();
     Gerente g = new Gerente(rp);
     OutraClasseSua ocs = new OutraClasseSua(rp);
   }

}

espero ter ajudado!
Abraços

S

Valeu gente. Foi muito útil. Vai dar certo aqui.

WellingtonRamos

@ECO2004 tornar o Map estático não resolve o problema e ainda cria outro.

Não resolve o problema porque há uma falha de orientação a objetos já indicada pelo @clunsde e @felipe_gdr.
Cria outro problema porque pode existir outra instância de Gerente que terá seu próprio Map. Ao tornar o Map estático, além dele ser compartilhado entre a Classe Gerente e a “outra classe”, será compartilhada ENTRE as instâncias de Gerente.

Criado 6 de fevereiro de 2013
Ultima resposta 6 de fev. de 2013
Respostas 5
Participantes 5