Probleminha, galera!
Suponham que eu tenho essas 3 classes:
(Código 1)
public class Pacote implements Serializable{
static final String serialVersionId = "blablabla1";
int id;
List<Item> itens;
//... gets e sets ...
}
public class Item implements Serializable{
static final String serialVersionId = "blablabla2";
int id;
Pacote pacote;
List<ItemHistorico> historico;
//... gets e sets ...
}
public class ItemHistorico implements Serializable{
static final String serialVersionId = "blablabla3";
int id;
String nome;
Item item;
//... gets e sets ...
}
A seguir apresento este código:
(Código 2)
public static void montarItensHistoricos(List<Item> itens){
Item item;
ItemHistorico itemHistorico;
for(int i = 0; i < itens.size(); i++){
item = itens.get(i);
itemHistorico = new ItemHistorico();
itemHistorico.setNome("exemplo " + i);
itemHistorico.setItem(item);
item.setHistorico(new ArrayList<ItemHistorico>());
item.getHistorico().add(itemHistorico);
}
}
O que eu espero como resultado final deste código é o seguinte, após uma iteração de 2 itens:
No entanto o que eu obtenho é este resultado:
A causa disso eu mesmo posso lhes dizer.
(Como Java utiliza ponteiros implicitamente, buscarei abordar o problema orientando o caso ao uso de ponteiros)
Ao realizar o Código2, supondo a iteração daqueles 2 itens, eu tenho a lista de itens, e tenho um ponteiro “item”, que apontará para cada item durante cada uma das repetições, certo? Então, na primeira repetição, o ponteiro “item” está apontando para o primeiro item da lista “itens”, e em dado momento realiza esta operação: “itemHistorico.setItem(item);”. Ao fazer isto, estamos dizendo ao Java que o ponteiro pra Item que há dentro do objeto “itemHistórico” vai apontar para onde também aponta o ponteiro “item” (é confuso, mas pra quem tá acostumado com ponteiros, é só ler umas 3 vezes que dá pra entender :roll: ).
Na segunda repetição da iteração no Código 2, o ponteiro “item” vai apontar para o elemento seguinte na lista “itens”. Quando o ponteiro “item” passar a apontar para este elemento, aquele objeto “itemHistorico” também terá seu apontador de item apontando pra lá, pois a atribuição de objetos em Java é feita por referência.
Alguém sabe como eu posso fazer para obter o primeiro resultado mencionado?
Uma nota importante é o seguinte: eu não quero criar um novo objeto item dentro de itemHistorico para copiá-lo por valor. O que eu quero é referenciar os itens da lista “itens”, e que cada itemHistorico esteja referenciando seu item correspondente na iteração.