Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Classe auto-referenciada

Sei que nesse curso não fala sobre esse assunto, ou eu não notei. Mas em algum curso mais para frente fala sobre classe auto-referenciada?

Por exemplo, tenho uma classe Administradores, que são os que tem login para o site, eles tem ID, Nome, Login, Senha, ..., DataAlteração, QuemAlterou.

Esse é o ponto, no campo QuemAlterou é guardado outro Administrador, então...

class Admin {
    int id;
    String nome;

    Admin quemAlterou;

    public Admin(int id) {
        /* consulta sql para retornar as informações 
        select * from admin where id = $id

        resultados...
        id_ = row["id"];
        nome_ = row["nome"];
        quem_ = row["quem"];
        */

        this.id=id_;
        this.nome=nome_;
         this.quemAlterou=new Admin(quem_);
    }
}

public class HelloWorld{

     public static void main(String []args){

        Admin ad = new Admin(1); 
     }
}

Desculpe se meu código não pode ser totalmente testado, na verdade estou programando em PHP.

A minha duvida é essa, vou ter um loop de Admin dentro de Admin. Ou meu raciocínio está totalmente furado? Se faz algum sentido, como fazer para parar no primeiro subAdmin?

Se estou postando no lugar errado, desculpe, e obrigado pela ajuda.

1 resposta
solução!

Opa Eduardo,

Nesse caso vai sim. Seu construtor de Admin vai chamar outro construtor de Admin, que vai chamar outro, etc. Um teste rápido nos permite ver um estouro de pilha.

Entretanto, o problema acontece porque no construtor você chama o construtor e não tem nenhuma condição de parada. Estruturas recursivas funcionam desde que estejam bem definidas.

Por exemplo, se o parâmetro quem for 0, imagino que não há um Admin que alterou algo. Então se seu construtor for

public Admin(int id) {
    /* consulta sql para retornar as informações 
    select * from admin where id = $id

    resultados...
    id_ = row["id"];
    nome_ = row["nome"];
    quem_ = row["quem"];
    */

    this.id=id_;
    this.nome=nome_;
    if(quem_ != 0)
        this.quemAlterou=new Admin(quem_);
}

e você garantir que esse 0 sempre aparece, você tem uma base para sua recursão e tudo funciona. Mesmo assim é preciso alguns cuidados. Se você tem qualquer ciclo, por exemplo, um Admin que alterou outro e esse outro alterou o original, você tem outro laço infinito.

Ainda que seja possível prosseguir dessa maneira, provavelmente você pode modelar essa classe de outra forma. Recomendo que você explore outras possibilidades para evitar problemas.