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

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.

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

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.

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.

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

[quote=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.[/quote]

Não existe outra forma.