[Resolvido] StackOverFlowError. Associação bidirecional

Olá!

Então… Tenho uma associação bidirecional entre duas classses (ControladorPrincipal e ControladorClientes)

O ControladorPrincipal tem uma variavel chamada controladorClientes que instancia ControladorClientes enquanto ControladorClientes tem uma que instancia ControladorPrincipal. Eu preciso usar um método existente em ControladorPrincipal no ControladorCliente e o mesmo ocorre com o ControladorPrincipal. Como eu poderia resolver isso?

Vou chutar aqui que a galera não entendeu muito bem. Talvez com código a gente entenda melhor! Dá uma olhada no post “Como fazer uma boa pergunta?”.

Eu não sei se consegui entender. Se precisa usar o método existente em outra classe, apenas use. O que está te impedindo disso? Os métodos estão como private?

Tentei colocar em código o que você descreveu, mas não consegui ver nenhum problema:

class ControladorPrincipal {
    ControladorCliente controladorCliente = new ControladorCliente();

    void metodoDosSonhos() {  // <--- Método que você quer usar
        System.out.println("Quero ser executado...");
    }
}

class ControladorCliente {
    ControladorPrincipal controladorPrincipal = new ControladorPrincipal();

    void realizandoMeusSonhos() {
        controladorPrincipal.metodoDosSonhos(); // <---- Usando o método que você queria usar
    }
}
1 curtida

Gostei dos nomes dos métodos! haha
Foi mal por não conseguir expressar bem o que queria dizer (realmente, faltou o codigo…)

Então, era algo como isso que você escreveu. O problema é que estava acontecendo um loop de instanciação, ou algo assim.

O que estava acontecendo é o seguinte:

ControladorPrincipal instancia ControladorCliente:

ControladorCliente controladorCliente = new ControladorCliente();

Ao instanciar o ControladorCliente (new ControladorCliente()), o ControladorCliente, em seu método construtor, instancia ControladorPrincipal

ControladorPrincipal controladorPrincipal = new ControladorPrincipal();

E, ai, volta ao inicio, fazendo esse loop eterno.

Eu felizmente já consegui a solução para esse problema:
Criar uma variavel do tipo ControladorPrincipal.
No método construtor do ControladorCliente, em vez de instanciar um ControladorPrincipal, receber um ControladorPrincipal como parametro e declarar a variavel do tipo ControladorPrincipal. No ContrladorPrincipal, instanciar o ControladorClientes passando como parametro ele mesmo, ‘this’.

ficaria

class ControladorPrincipal {

controladorCliente controladorCliente;

    public ControladorPrincipal(){
    controladorCliente = new ControladorCliente(this);
    }

    void metodoDosSonhos() {  // <--- Método que você quer usar
    System.out.println("Quero ser executado...");
    }
}

class ControladorCliente {

ControladorPrincipal controladorPrincipal;

    public ConstroladorCliente(ControladorPrincipal controladorPrincipal){
    this.controladorPrincipal= controladorPrincipal;
    }


    void realizandoMeusSonhos() {
    controladorPrincipal.metodoDosSonhos(); // <---- Usando o método que você queria usar

Boa!

1 curtida