2012-02-24 8 views
11

Ho un solo fagiolo molla simile di seguito:Gli oggetti di classe interna non statici vengono eliminati dopo che non vengono più referenziati?

public class MyServiceImpl { 
    private MyDAO myDAO; 

    public class MyInnerClass implements SomeInterface<MyInnerClass> { 

     @Override 
     public MyInnerClass loadFreshObject(final String key) { 
      return myDAO.load(key); 
     } 
    } 

} 

istanze di MyInnerClass vengono creati in codice esterno del chicco molla ma nessun riferimento a quei casi vengono tenuti.

Presumendo che non ho alcun controllo sull'uso di queste classi interne pubbliche non statiche (so che idealmente queste sarebbero private e statiche per evitare di far trapelare il riferimento a "this"), le istanze create di "MyInnerClass" saranno raccolta dei rifiuti corretta?

Ho eseguito i miei test su questo superando lo finalize() e sembra che le istanze siano state raccolte correttamente, stavo solo sperando in un chiarimento su questo.

Grazie

+0

"* Un iteratore di una raccolta viene in genere implementato come una classe interna della raccolta. *" Mi ha aiutato a capire la relazione tra le vite delle classi interne ed esterne. –

risposta

16

Le istanze della classe interna saranno raccolte da rifiuti in base alle normali regole (ad esempio quando non sono più referenziate). Tuttavia, ogni istanza della classe interna contiene un riferimento nascosto alla sua istanza genitore della classe esterna. Ciò significa che se ci sono riferimenti in tempo reale a istanze della classe interna, impediranno che le istanze associate della classe esterna vengano tralasciate. Ma funziona solo in quella direzione, non viceversa.

0

Se non ci sono riferimenti all'oggetto, che verranno contrassegnate per la raccolta. Quindi, dovrebbe andare bene, anche se è una classe interiore pubblica, non statica.

In alternativa, se ci fossero riferimenti a questi oggetti di classe interna, non verrà raccolto l'oggetto di classe esterno, anche se non vi sono riferimenti diretti ad esso.

3

Perché non raccoglievano i rifiuti? Il GC non si preoccupa del tipo di oggetto. Se è irraggiungibile, è GCed. Se è raggiungibile, non è GCed.

+0

Questo è quello che pensavo, non lo ero se c'era qualche riferimento implicito dalla classe esterna alla classe interiore. –

+0

No, non c'è. Il contrario è vero. La classe interna non statica contiene un riferimento alla sua istanza di classe esterna. –

0

Ovviamente, se le tue istanze vengono mantenute da Spring come bean singleton, Spring (ma non il tuo codice) manterrà il riferimento a esse e non saranno raccolte.

Problemi correlati