Pergunta

(pergunta Java)

Se eu referência a um campo em uma classe interna, faz isso causa uma dependência circular entre a classe delimitador e a classe interna?

Como posso evitar isso?

Aqui está um exemplo:

public class Outer {

  private Other o;
  private Inner i;    

  public Outer() {
    o = new Other();

    i = new Inner() {
      public void doSomething() {
        o.foo();
      }
    };

  }
}
Foi útil?

Solução

estática vs classe exemplo: Se você declarar a classe interna como estático, em seguida, as instâncias da classe interna não tem qualquer referência à classe externa. Se não for Satic então seu objeto interno efectivelly aponta para o objeto externo que o criou (que tem uma referência implícita, de fato, se você usar a reflexão sobre seus construtores você verá um parâmetro extra para receber a instância externa).

pontos instância interna exemplo exterior: Referência circular é no caso de cada instância aponta o outro. Um monte de vezes que você usar classes internas para elegantemente implementar alguma interface e acessar campos privados enquanto não implementar a interface com a classe externa. Isso significa instância interior aponta exemplo exterior, mas não significa que o oposto. Não necesary uma referência circular.

Fechando o círculo: De qualquer forma não há nada de errado com referência circular em Java. Objetos funcionar muito bem e quando eles não estão mais referenciada eles são lixo coletado. Não importa se eles apontam o outro.

Outras dicas

A sintaxe que você está usando no exemplo é um pouco fora não há nenhuma declaração da classe ou interface interna. Mas não há nada de errado com o conceito do exemplo. Em Java ele vai funcionar bem.

Eu não tenho certeza que você está fazendo aqui, mas você pode querer considerar um design mais simples para manutenção etc.

É um padrão comum para manipuladores de eventos anónimos a elementos de referência de sua classe pai, então não há razão para evitá-lo se esse for o caso, isso é como Java foi projetado em vez de ter ponteiros de função.

(Não tenho certeza se é isso que você está perguntando ...)

Durante a execução, a classe interna tem uma referência implícita para o exemplo da classe externa a que pertence. Assim, sempre que você passar a instância de classe interna ao redor, você também está passando a instância da classe externa ao redor.
Você pode evitar que, ao declarar a classe interna como "estática", mas isso significa que a classe interna não pode variáveis ??de membro de acesso da classe externa. Então, nesse caso, se você quiser acessar um membro da classe externa, é preciso passá-lo explicitamente para a classe interna (usando um setter ou usando o construtor da classe interna).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top