Frage

(Java Frage)

Wenn ich ein Feld in einer inneren Klasse verweisen, verursacht dies eine zirkuläre Abhängigkeit zwischen der umgebenden Klasse und der inneren Klasse?

Wie kann ich das vermeiden?

Hier ist ein Beispiel:

public class Outer {

  private Other o;
  private Inner i;    

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

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

  }
}
War es hilfreich?

Lösung

Statische vs Instanzklasse: Wenn Sie die innere Klasse als statische dann die Instanzen der inneren Klasse deklarieren haben keinen Bezug auf die äußere Klasse. Wenn es nicht satic ist dann Ihr inneres Objekt zeigt efectivelly auf das äußere Objekt, das sie geschaffen (es hat eine implizite Referenz, in der Tat, wenn Sie Reflexion über seine Konstrukteure verwenden werden Sie einen zusätzlichen Parameter zur Aufnahme der äußeren Instanz sehen).

Innere Instanz weist äußeree Instanz: Rund Referenz ist bei jeder Instanz der andere verweist. Eine Menge Zeit, verwenden Sie innere Klassen für elegant eine Schnittstelle implementieren und den Zugriff auf private Felder, während nicht die Schnittstelle mit der äußeren Klasse implementieren. Es bedeutet innere Instanz äußere Instanz weist aber nicht bedeutet das Gegenteil. Nicht einen zirkulären Verweis necesary.

Der Kreis schließt sich: Auf jeden Fall gibt es nichts falsch mit Kreis Referenzierung in Java. Objekte arbeiten gut, und wenn sie nicht mehr referenziert sind sind sie Müll gesammelt. Dabei spielt es keine Rolle, ob sie sich zeigen.

Andere Tipps

Die Syntax Sie in dem Beispiel verwendet sind ein wenig aus gibt es keine Deklaration der Klasse oder Schnittstelle Inner ist. Aber es ist nichts falsch mit dem Konzept des Beispiels. In Java wird es funktionieren.

Ich bin mir nicht sicher, was Sie hier tun, aber Sie können ein einfacheres Design für Wartbarkeit usw. zu betrachten.

Es ist ein gemeinsames Muster für anonyme Event-Handler Elemente ihrer übergeordneten Klasse zu verweisen, also kein Grund, es zu vermeiden, wenn das der Fall ist, das ist, wie Java entwickelt wurde stattdessen Funktionszeiger zu haben.

(nicht sicher, ob dies ist, was Sie fragen ...)

Zur Laufzeit die innere Klasse hat einen impliziten Verweis auf die Instanz der äußeren Klasse es gehört. Also, wenn Sie die innere Klasseninstanz um passieren, werden Sie vorbei auch die äußere Klasseninstanz um.
Sie können das vermeiden, indem die innere Klasse als „statisch“ erklärt, aber das bedeutet, dass die innere Klasse nicht Membervariablen der äußeren Klasse zugreifen kann. Also in diesem Fall, wenn Sie ein Mitglied der äußeren Klasse zugreifen möchten, müssen Sie es auf die innere Klasse explizit passieren (eine Setter oder mit dem Konstruktor der inneren Klasse verwendet wird).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top