Domanda

(domanda Java)

Se faccio riferimento a un campo in una classe interna, ciò provoca una dipendenza circolare tra la classe che racchiude e la classe interna?

Come posso evitarlo?

Ecco un esempio:

public class Outer {

  private Other o;
  private Inner i;    

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

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

  }
}
È stato utile?

Soluzione

Classe statica vs istanza: se dichiari la classe interna come statica, le istanze della classe interna non hanno alcun riferimento alla classe esterna. Se non è statico, l'oggetto interno indica in modo efficace l'oggetto esterno che lo ha creato (ha un riferimento implicito, infatti, se usi la riflessione sui suoi costruttori vedrai un parametro extra per ricevere l'istanza esterna).

L'istanza interna indica l'istanza esterna: il riferimento circolare è nel caso in cui ogni istanza punti l'altra. Molte volte usi le classi interne per implementare elegantemente alcune interfacce e accedere ai campi privati ??senza implementare l'interfaccia con la classe esterna. Significa istanza interna che indica istanza esterna, ma non significa il contrario. Non è necessario un riferimento circolare.

Chiusura della cerchia: Comunque non c'è niente di sbagliato nel riferimento circolare in Java. Gli oggetti funzionano bene e quando non sono più referenziati vengono raccolti. Non importa se si indicano l'un l'altro.

Altri suggerimenti

La sintassi che stai usando nell'esempio è un po 'fuori non c'è alcuna dichiarazione della classe o dell'interfaccia Inner. Ma non c'è niente di sbagliato nel concetto dell'esempio. In Java funzionerà bene.

Non sono sicuro di quello che stai facendo qui, ma potresti voler prendere in considerazione un design più semplice per la manutenibilità ecc.

È un modello comune per i gestori di eventi anonimi fare riferimento a elementi della loro classe genitore, quindi non c'è motivo di evitarlo in tal caso, ecco come è stato progettato Java invece di avere puntatori a funzione.

(Non sono sicuro se questo è quello che stai chiedendo ...)

In fase di runtime, la classe interna ha un riferimento implicito all'istanza della classe esterna a cui appartiene. Quindi ogni volta che passi l'istanza di classe interna, passa anche l'istanza di classe esterna.
Puoi evitarlo dichiarando la classe interna come "statica", ma ciò significa che la classe interna non può accedere alle variabili membro della classe esterna. Quindi, in tal caso, se si desidera accedere a un membro della classe esterna, è necessario passarlo esplicitamente alla classe interna (usando un setter o usando il costruttore della classe interna).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top