Substituição dos elementos de uma lista pelo ultimo adicionado

5 respostas
JhowTroMundo

Olá, pessoal.

Estou tendo problemas ao adicionar um mesmo objeto (que muda o valor de seus atributos com o tempo) numa lista.

Crio o objeto, seto os valores, adiciono na lista. Seto novos valores, adiciono novamente na lista, e assim sucessivamente.

Debugando, percebo que TODOS os objetos adicionados anteriormente recebem os mesmos valores que foram setados por ultimo, assim tenho uma lista com todos os objetos identicos ao ultimo elemento adicionado.

Sejá que vou ter que instanciar um novo objeto pra cada adição na lista?

Quando adiciono um obejeto numa lista, ele nao deveria se tornar independente? Por que ele continua sendo referencia do objeto originalmente criado?

Existe outra solução?

Obrigado, gente.

5 Respostas

drsmachado

Qual o código? Pode postá-lo?

JhowTroMundo

Acho que a explanação do problema foi bem explicativa, mas aí vai.

private boolean validarCamposDetalheN(LeitorArquivosGSB leitor){
		
		List<RelacoesCampoBeanGSB> listaCampoBean = new ArrayList<RelacoesCampoBeanGSB>();
		
		RelacoesCampoBeanGSB campoBean = new RelacoesCampoBeanGSB();
		//1
		campoBean.setLinhaCampoBeanGSB(leitor.getNumeroLinhaAtual());
		campoBean.setNomeCampoBeanGSB(ElementosXMLDARFRetorno.PERIODO_APURACAO_N.getNomeElementoXMLDARF());
		campoBean.setValorCampoBeanGSB(leitor.getCampoDetalheArquivoN(ElementosXMLDARFRetorno.PERIODO_APURACAO_N));
		campoBean.setTipoCampoBeanGSB(getCampoDARF(ElementosXMLDARFRetorno.PERIODO_APURACAO_N, RegistrosGSB.DETALHE_DE_ARQUIVO_RETORNO_N).getTipo());
		
		listaCampoBean.add(campoBean);
		//2
		campoBean.setLinhaCampoBeanGSB(leitor.getNumeroLinhaAtual());
		campoBean.setNomeCampoBeanGSB(ElementosXMLDARFRetorno.IDENTIFICACAO_CONTRIBUINTE_N.getNomeElementoXMLDARF());
		campoBean.setValorCampoBeanGSB(leitor.getCampoDetalheArquivoN(ElementosXMLDARFRetorno.IDENTIFICACAO_CONTRIBUINTE_N));
		campoBean.setTipoCampoBeanGSB(getCampoDARF(ElementosXMLDARFRetorno.IDENTIFICACAO_CONTRIBUINTE_N, RegistrosGSB.DETALHE_DE_ARQUIVO_RETORNO_N).getTipo());
		
		listaCampoBean.add(campoBean);
		//3
		campoBean.setLinhaCampoBeanGSB(leitor.getNumeroLinhaAtual());
		campoBean.setNomeCampoBeanGSB(ElementosXMLDARFRetorno.CODIGO_RECEITA_TRIBUTO_N.getNomeElementoXMLDARF());
		campoBean.setValorCampoBeanGSB(leitor.getCampoDetalheArquivoN(ElementosXMLDARFRetorno.CODIGO_RECEITA_TRIBUTO_N));
		campoBean.setTipoCampoBeanGSB(getCampoDARF(ElementosXMLDARFRetorno.CODIGO_RECEITA_TRIBUTO_N, RegistrosGSB.DETALHE_DE_ARQUIVO_RETORNO_N).getTipo());
		
		listaCampoBean.add(campoBean);
		//4
		campoBean.setLinhaCampoBeanGSB(leitor.getNumeroLinhaAtual());
		campoBean.setNomeCampoBeanGSB(ElementosXMLDARFRetorno.DATA_VENCIMENTO_N.getNomeElementoXMLDARF());
		campoBean.setValorCampoBeanGSB(leitor.getCampoDetalheArquivoN(ElementosXMLDARFRetorno.DATA_VENCIMENTO_N));
		campoBean.setTipoCampoBeanGSB(getCampoDARF(ElementosXMLDARFRetorno.DATA_VENCIMENTO_N, RegistrosGSB.DETALHE_DE_ARQUIVO_RETORNO_N).getTipo());
		
		listaCampoBean.add(campoBean);
		//5
		campoBean.setLinhaCampoBeanGSB(leitor.getNumeroLinhaAtual());
		campoBean.setNomeCampoBeanGSB(ElementosXMLDARFRetorno.VALOR_PRINCIPAL_N.getNomeElementoXMLDARF());
		campoBean.setValorCampoBeanGSB(leitor.getCampoDetalheArquivoN(ElementosXMLDARFRetorno.VALOR_PRINCIPAL_N));
		campoBean.setTipoCampoBeanGSB(getCampoDARF(ElementosXMLDARFRetorno.VALOR_PRINCIPAL_N, RegistrosGSB.DETALHE_DE_ARQUIVO_RETORNO_N).getTipo());
		
		listaCampoBean.add(campoBean);
		//6
		campoBean.setLinhaCampoBeanGSB(leitor.getNumeroLinhaAtual());
		campoBean.setNomeCampoBeanGSB(ElementosXMLDARFRetorno.VALOR_PAGAMENTO_N.getNomeElementoXMLDARF());
		campoBean.setValorCampoBeanGSB(leitor.getCampoDetalheArquivoN(ElementosXMLDARFRetorno.VALOR_PAGAMENTO_N));
		campoBean.setTipoCampoBeanGSB(getCampoDARF(ElementosXMLDARFRetorno.VALOR_PAGAMENTO_N, RegistrosGSB.DETALHE_DE_ARQUIVO_RETORNO_N).getTipo());
		
		listaCampoBean.add(campoBean);
		//7
		campoBean.setLinhaCampoBeanGSB(leitor.getNumeroLinhaAtual());
		campoBean.setNomeCampoBeanGSB(ElementosXMLDARFRetorno.OCORRENCIA_N.getNomeElementoXMLDARF());
		campoBean.setValorCampoBeanGSB(leitor.getCampoDetalheArquivoN(ElementosXMLDARFRetorno.OCORRENCIA_N));
		campoBean.setTipoCampoBeanGSB(getCampoDARF(ElementosXMLDARFRetorno.OCORRENCIA_N, RegistrosGSB.DETALHE_DE_ARQUIVO_RETORNO_N).getTipo());
		//TODO TRATAR OCORRENCIAS
		listaCampoBean.add(campoBean);
				
		//Enquanto houver campos na linha
		//validar campo
		
		for (RelacoesCampoBeanGSB campoGSB : listaCampoBean) {
			System.out.println(campoGSB.getNomeCampoBeanGSB());
			if(!validaCampoNumericoTextoData(campoBean.getValorCampoBeanGSB(), campoBean.getTipoCampoBeanGSB())){
				setMensagemDeErro(MENSAGEM_CAMPO_CONTEUDO_INVALIDO, campoGSB.getLinhaCampoBeanGSB(), campoGSB.getNomeCampoBeanGSB());
				return false;
			}
		}
		
		mapaLinhaCamposBeanGSB.put(leitor.getNumeroLinhaAtual(), listaCampoBean);
		
		return true;
	}

Eu entendi o que acontece (mesma referencia), apesar de nao entender o por quê.
Sei que se criar uma nova instancia pra cada adição resolvo isso mas gostaria de saber se há outra forma.

Obrigado.

pmlm

Se sabes a repostas porque perguntas? :slight_smile:

Apesar de adicionares à lista, o objecto campoBean continua a ser o mesmo que está na lista. Assim, enquanto não fizeres um new, estás a alterar o objecto que também está na lista.

eliangela

Ola!

Quando vc insere um objeto na lista, vc está inserindo uma referência desse objeto. Se vc alterar o objeto original, ele vai alterar “as outras cópias (referências)”.
O que vc deve fazer pra resolver esse problema é sempre criar outro objeto para inserir na lista.

Espero ter ajudado

eliangela

JhowTroMundo:

Eu entendi o que acontece (mesma referencia), apesar de nao entender o por quê.
Sei que se criar uma nova instancia pra cada adição resolvo isso mas gostaria de saber se há outra forma.
Obrigado.

Não existe outra forma.

Criado 7 de junho de 2011
Ultima resposta 7 de jun. de 2011
Respostas 5
Participantes 4