[Resolvido]Duvida com List

Galera,

Estou encabulado com isso! Vejam o código abaixo:

[code]ChuvasEntity chuvasEntity = new ChuvasEntity();
List listaChuvasEntity = new ArrayList();

		chuvasEntity.setDia(1);
		listaChuvasEntity.add(chuvasEntity);
			
		chuvasEntity.setDia(2);
		listaChuvasEntity.add(chuvasEntity);[/code]

Quando estou “debugando” ele add o valor 1 normalmente, mas quando adiciono o valor 2, ele também sobrescreve o valor 1. Então eu fico com as duas posições do meu List com o valor 2. Estou fazendo da forma certa? Porque está sobrescrevendo?

O que acontece aqui é o seguinte… como vc ta usando o mesmo objeto para adicionar na lista, toda vez que vc modificar ele vai na referencia e muda o valor…

vc poderia fazer assim…

List listaChuvasEntity = new ArrayList();

		listaChuvasEntity.add(new ChuvasEntity(1));
			
		listaChuvasEntity.add(new chuvasEntity(2));

lembrando que teria que criar um construtor para a Classe ChuvasEntity

[quote=darklordkamui]O que acontece aqui é o seguinte… como vc ta usando o mesmo objeto para adicionar na lista, toda vez que vc modificar ele vai na referencia e muda o valor…

vc poderia fazer assim…

List listaChuvasEntity = new ArrayList();

		listaChuvasEntity.add(new ChuvasEntity(1));
			
		listaChuvasEntity.add(new chuvasEntity(2));

lembrando que teria que criar um construtor para a Classe ChuvasEntity
[/quote]

Rapaz, recentemente tive extamente o mesmo problema com um código em C# e resolvi desse mesmo modo que você. Mas o que não entendi é que teoricamente estave sendo feito uma passagem por cópia e mesmo assim dava o problema. Bizarro.

[quote=matheuslmota][quote=darklordkamui]O que acontece aqui é o seguinte… como vc ta usando o mesmo objeto para adicionar na lista, toda vez que vc modificar ele vai na referencia e muda o valor…

vc poderia fazer assim…

List listaChuvasEntity = new ArrayList();

		listaChuvasEntity.add(new ChuvasEntity(1));
			
		listaChuvasEntity.add(new chuvasEntity(2));

lembrando que teria que criar um construtor para a Classe ChuvasEntity
[/quote]

Rapaz, recentemente tive extamente o mesmo problema com um código em C# e resolvi desse mesmo modo que você. Mas o que não entendi é que teoricamente estave sendo feito uma passagem por cópia e mesmo assim dava o problema. Bizarro.[/quote]

Achei estranho mesmo, porque ele cria uma nova posição no meu List. Se ele não criasse essa nova posição até entenderia… Mas resolvido. VOu fazer assim também. Obrigado pessoal!

o que acontece no codigo que vc fez é o seguinte…

eu tenho um objeto alocado na posição x da memoria…

pego ele e adiciono um novo atributo no caso a data no valor 1…
e adiciono na lista…

ai vc foi la e pegou o mesmo objeto e mudou o atributo dele para 2…
e adicionou ele na lista…

resumindo o modo que vc criou somente ira pega a mesma instancia de objeto e o modificar, ao invez de criar uma nova…

[quote=darklordkamui]o que acontece no codigo que vc fez é o seguinte…

eu tenho um objeto alocado na posição x da memoria…

pego ele e adiciono um novo atributo no caso a data no valor 1…
e adiciono na lista…

ai vc foi la e pegou o mesmo objeto e mudou o atributo dele para 2…
e adicionou ele na lista…

resumindo o modo que vc criou somente ira pega a mesma instancia de objeto e o modificar, ao invez de criar uma nova…
[/quote]

Pois é, mas até onde eu saiba ele fez uma passagem por cópia, o que teoricamente garantiria duas instãncias diferentes passadas para a lista. Até onde eu saiba só existe passagem por cópia em Java.

[quote=matheuslmota][quote=darklordkamui]o que acontece no codigo que vc fez é o seguinte…

eu tenho um objeto alocado na posição x da memoria…

pego ele e adiciono um novo atributo no caso a data no valor 1…
e adiciono na lista…

ai vc foi la e pegou o mesmo objeto e mudou o atributo dele para 2…
e adicionou ele na lista…

resumindo o modo que vc criou somente ira pega a mesma instancia de objeto e o modificar, ao invez de criar uma nova…
[/quote]

Pois é, mas até onde eu saiba ele fez uma passagem por cópia, o que teoricamente garantiria duas instãncias diferentes passadas para a lista. Até onde eu saiba só existe passagem por cópia em Java.[/quote]

Não… ele não garante criar outra instancia… parece logico que ele ao adicionar um vai la e crie um novo… mais ele não faz isso… ele vai olhar la e dizer ha esse cara com a posição x existe já vou sobre escrever pelo novo

para vc ver isso acontecer… manda ele imprimir em um sysout veras que o valor de memoria é o mesmo em ambos

[quote=darklordkamui]
Pois é, mas até onde eu saiba ele fez uma passagem por cópia, o que teoricamente garantiria duas instãncias diferentes passadas para a lista. Até onde eu saiba só existe passagem por cópia em Java.[/quote]

Não… ele não garante criar outra instancia… parece logico que ele ao adicionar um vai la e crie um novo… mais ele não faz isso… ele vai olhar la e dizer ha esse cara com a posição x existe já vou sobre escrever pelo novo

para vc ver isso acontecer… manda ele imprimir em um sysout veras que o valor de memoria é o mesmo em ambos[/quote]

Pois é, interessante isso. A lógica é que seja uma passagem por cópia. Vai ver que pra economizar memória o Java opta por passar uma referência.