Construtor com recursividade infinita

7 respostas
carlos.e.a

Ola pessoal,

To com um probleminha aqui e gostaria muito da opiniao de voces:

Seguinte, tenho umas classes mais ou menos desse jeito:

public class ObjetoADTO(){
   private int x;
   private ObjetoBDTO instanciaDeB;

//gets e sets
}
public class ObjetoBDTO(){
   private int y;
   private ObjetoADTO instanciaDeA;

//gets e sets
}

Acontece que eu queria usar um construtor que instancisse os objetos de cada uma das classes...Porem vai entrar em loop infinito. Eu encontrei uma solucao fazendo um metodo instanciar(){} onde o mesmo realizaria o trabalho do construtor sem cair em loop. Mas acredito que isso é muito frequente principalmente na criacao de classes de persistencia e esse negocio de ter de chamar esse metodo instanciar() toda vez que criar um objeto dessas classes seja um tanto inconveniente.
Entao eu gostaria de saber se alguem tem outra solucao ou mesmo se existe uma solucao para esse problema de forma predefinida em java!

Desde já agradeço!

7 Respostas

rmendes08

Cara, essa dependência é que é estranha pra falar a verdade. Não seria o caso de revê-la ? Geralmente quando uma idéia é difícil de ser codificada isso é um indicativo de design complexo.

kenneth

Fala brow,

Realmente, ta meio diferente isso… Dois objetos que tenham cada um uma instancia do outro…
É alguma situacao real que voce precisa recriar ou é so teste/aprendizado mesmo?

Abraco!

carlos.e.a

Mas isso é muito normal em persistencia galera! Tipo, nas minhas tabelas tem varias dependencias desse tipo. E é sim uma aplicacao real. Tipo, vou dar um exemplo que tenho aqui: Tenho um Usuario que tem uma Coordenacao. E nessa Coordenacao tem um supervisor, que no caso é um Usuario. Eu to dando só um exemplo, mas aqui na base que eu peguei tah cheio disso…Se alguem tiver uma solucao melhor que essa que eu achei… Pq jah ta se tornando chato chamar esse metodo toda vez que crio um objeto.

E desde já obrigado pelas respostas!

carlos.e.a

Bom eu tava pensando alto aqui e consegui outra solucao: criar um construtor sobrecarregado que recebe um boolean. Ai esse boolean ia determinar se iria ser feito o carregamento em cascata ou nao. Tipo se eu colocasse true ele instanciava o Usuario por exemplo e instanciava o coordenador. E como o coordenador iria ter o construtor padrao vazio iria parar por ai. Mas o que eu realmente queria saber é se existe alguma solucao padrao pra isso…Se alguem ja passou pelo mesmo problema e como resolveu.

Vlw!

Luiz_Augusto_Prado

carlos.e.a:
Mas isso é muito normal em persistencia galera! Tipo, nas minhas tabelas tem varias dependencias desse tipo. E é sim uma aplicacao real. Tipo, vou dar um exemplo que tenho aqui: Tenho um Usuario que tem uma Coordenacao. E nessa Coordenacao tem um supervisor, que no caso é um Usuario. Eu to dando só um exemplo, mas aqui na base que eu peguei tah cheio disso…Se alguem tiver uma solucao melhor que essa que eu achei… Pq jah ta se tornando chato chamar esse metodo toda vez que crio um objeto.

E desde já obrigado pelas respostas!

já vi algo assim.

quando vc tem auto relacionamentos pode acontecer.
imagina uma rede social, onde uma galerona conhece outra e assim sucessivamente… seu grafo é limitado, mas o número de caminhos a se seguir são infinitos.
no hibernate vc não pode colocar eager em tabelas com auto relacionamento complexos. tem que ser no lazy e ir navegando de um por um pelos detalhes.

di.magdaleno
carlos.e.a:
Bom eu tava pensando alto aqui e consegui outra solucao: criar um construtor sobrecarregado que recebe um boolean. Ai esse boolean ia determinar se iria ser feito o carregamento em cascata ou nao. Tipo se eu colocasse true ele instanciava o Usuario por exemplo e instanciava o coordenador. E como o coordenador iria ter o construtor padrao vazio iria parar por ai. Mas o que eu realmente queria saber é se existe alguma solucao padrao pra isso...Se alguem ja passou pelo mesmo problema e como resolveu. Vlw!
Uma forma de resolver esse relacionamento poderia ser conforme abaixo:
class A {
	B b;
	
	A(){
		this.b = new B(this);
	}
}

class B {
	A a;
	
	B(A a){
		this.a = a;
	}
}
Assim, sempre que instanciar um A ele será composto por um B que por sua vez será composto pela mesma instância de A sem recursividade infinita. Da forma como está, o objeto A precisa sempre ser instanciado antes do B, mas nada que sobrecarregar uns construtores com a lógica inversa não resolva.

Espero ter ajudado.

carlos.e.a

Sei que o objetivo é ajudar, mas nao resisto a piada. De qualquer forma fica para consulta a outros que passem pelo problema.

Criado 9 de fevereiro de 2011
Ultima resposta 14 de ago. de 2013
Respostas 7
Participantes 5