Pregunta

(pregunta de Java)

Si hago referencia a un campo en una clase interna, ¿esto causa una dependencia circular entre la clase adjunta y la clase interna?

¿Cómo puedo evitar esto?

Aquí hay un ejemplo:

public class Outer {

  private Other o;
  private Inner i;    

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

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

  }
}
¿Fue útil?

Solución

Clase estática vs instancia: Si declara la clase interna como estática, las instancias de la clase interna no tienen ninguna referencia a la clase externa.Si no es sático, entonces su objeto interno apunta efectivamente al objeto externo que lo creó (tiene una referencia implícita; de hecho, si usa la reflexión sobre sus constructores, verá un parámetro adicional para recibir la instancia externa).

La instancia interna apunta a la instancia externa: La referencia circular es en caso de que cada instancia apunte a la otra.Muchas veces se utilizan clases internas para implementar elegantemente alguna interfaz y acceder a campos privados sin implementar la interfaz con la clase externa.Significa que la instancia interna apunta a la instancia externa, pero no significa lo contrario.No es necesaria una referencia circular.

Cerrando el círculo: De todos modos, no hay nada de malo en las referencias circulares en Java.Los objetos funcionan bien y cuando no se hace más referencia a ellos, se recolectan como basura.No importa si se señalan entre sí.

Otros consejos

La sintaxis que estás usando en el ejemplo está un poco fuera de lugar, no hay una declaración de la clase o interfaz interna.Pero no hay nada malo en el concepto del ejemplo.En Java funcionará bien.

No estoy seguro de lo que está haciendo aquí, pero es posible que desee considerar un diseño más simple para facilitar el mantenimiento, etc.

Es un patrón común para los controladores de eventos anónimos hacer referencia a elementos de su clase principal, por lo que no hay razón para evitarlo si ese es el caso, así es como se diseñó Java en lugar de tener punteros de función.

(No estoy seguro si esto es lo que estás preguntando...)

En tiempo de ejecución, la clase interna tiene una referencia implícita a la instancia de la clase externa a la que pertenece.Entonces, cada vez que pasas la instancia de clase interna, también estás pasando la instancia de clase externa.
Puede evitarlo declarando la clase interna como "estática", pero eso significa que la clase interna no puede acceder a las variables miembro de la clase externa.Entonces, en ese caso, si desea acceder a un miembro de la clase externa, debe pasarlo explícitamente a la clase interna (usando un definidor o usando el constructor de la clase interna).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top