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.