Acabei nem sabendo como dar nome a este tópico. Mas levanto um assunto legal. Vou dar um exemplo bem simples, não quer dizer que nesse exemplo seja um bom exemplo, mas foi o primeiro que eu pensei.
Um pedido tem uma lista de itens… O domínio deve ser algo do tipo:
class Pedido {
List<Item> itens;
// ...
}
class Item {
Produto produto;
int qtd;
// ...
}
A minha dúvida é: A classe Item pode ter um ponteiro para a classe Pai?
class Item {
Pedido pedido; // pai aqui!!
Produto produto;
int qtd;
// ...
}
As vezes é muito útil, você dentro de um filho saber qual é o pai dele! Na tabela do banco de dados, você tem a Foreign Key apontando para o pai, então carregar o pai é teoricamente fácil. Só tem que tomar muito cuidado para não entrar num loop infinito, e o pai carrega o filho, o filho carrega o pai, e assim por diante…
O que vocês fazem quando estão num filho e precisam do pai? Ou nunca precisam? Vocês modelam o sistema pra sempre passar a classe pai, com o filho/lista de filhos dentro ??
Existe uma relação inerente ao pai e ao filho chamada composição. O itens não fazem sentido sem o pai, logo faz sentido ter uma forma de obter o pai a partir do filho. Contudo não é permitido carregar filhos que não estejam dentro de pais. Ou seja, vc não pode pegar a lista de itens “solta” tem que pegar apenas o pai e o sistema traz o resto. Para evitar o problema do loop vc faz assim
class Pedido {
List<Item> itens;
public void addItem (Item item ){
if (item.pedido == null ){
item.pedido = this;
itens.add(item);
} else if (!item.pedido.equals(this)){
throw new IllegalArgumentException("Item pertence a outro pedido");
}
}
}
class Item {
Pedido pedido; // visivilidade pacote
private Produto produto;
private int qtd;
// ...
public Pedido getPedido(){
return pedido; // não ha set para este atributo.
}
}
Durante a leitura, vc lê o pedido e depois os itens e invoca addItem para cada um sem ler o campo “pedido” do item do banco. Ele será associado dentro do prorpio pedido
Mas atenção, esta tecnica só é valida de existe uma relação de composição.