2015-03-01 4 views
5

Nach dem Lernen über die innere Klasse, ich verstehe, dass es einen impliziten Verweis auf die äußere Klasse hat.Innere Klasse hat einen impliziten Verweis auf die äußere Klasse und kann Speicher verlieren

Aber mein Lehrer sagte mir, dass der beste Weg ist nicht innere Klasse verwenden, lieber statische innere Klasse verwenden. Weil die innere Klasse Speicher verlieren kann.

Kann jemand dies freundlich erklären?

+3

http://stackoverflow.com/questions/10864853/when-exactly-is-it-leak-safe-to-use-anonymous-inner-klassen – jas

+0

@jas danke, aber ich bin immer noch sehr verwirrend darüber. Ich kann unter dieser Lösung wegen der niedrigen Punktzahl nicht kommentieren. In der Lösung hieß es: "Das kann nur passieren, wenn ein Objekt außerhalb der enthaltenden Klasse einen Verweis auf das innere Objekt behält, ohne Rücksicht auf das enthaltene Objekt." Wie kann das passieren, wenn wir Zugang zu der inneren Klasse erhalten wollen, sollten wir Outer.Inner verwenden, oder? Es macht keinen Sinn, dass ein Objekt außerhalb der enthaltenden Klasse einen Verweis auf das innere Objekt ohne Rücksicht auf das enthaltene Objekt behält – Jie

Antwort

5

In der Antwort auf Ihren Kommentar (es wäre nicht lesbar, wenn ich es in den Kommentaren veröffentlicht), wo es gehört. Beispiel für den Zugriff auf die innere Klasse außerhalb des Äußeren.

public class Dog { 
    String name; 
} 

public class HugeKennel { 
    Double[] memmoryWaste = new Double[10000000]; 


    public List<Dog> getDogs() { 
     SneakyDog trouble = new SneakyDog("trouble"); 
     return Arrays.asList(trouble); 
    } 

    class SneakyDog extends Dog { 
     SneakyDog(String name) { 
      this.name = name; 
     } 
    } 

} 

woanders in Ihrem Code

List<Dog> getCityDogs() { 
    List<Dog> dogs = new ArrayList<>(); 
    HugeKennel k1 = ... 
    dogs.addAll(k1.getDogs()); 
    HugeKennel k2 = ... 
    dogs.addAll(k2.getDogs()); 
    return dogs; 
} 

.... 

List<Dog> cityDogs = getCityDogs(); 
for (Dog dog: dogs) { 
    walkTheDog(dog); 
} 
// even though the Kenels were local variables in of getCityDogs(), they cannot be removed from the memory, as the SneakyDogs in the list are still referencing their parent kennels. 
//from now on, until all the dogs are not disposed off, the kennels also have to stay in the memory. 

So brauchen Sie nicht über die innere Klasse durch seine parrent Klasse zuzugreifen, sobald das innere Objekt erstellt wird es wie jedes andere Objekt verwendet werden kann, und Wie im obigen Beispiel kann die Containerklasse "ausgespuckt" werden, wenn die Hundeliste Hinweise auf Hunde enthält, aber jeder Hund "weiß" immer noch über seine Hundehütte.

Das verknüpfte Beispiel von StackTrace war mit einem typischen Anwendungsfall verwandt, wenn die Innner-Klassen 'ad hock' als anonyme innere Klassen erstellt werden, aber es ist das gleiche Problem. Wenn Sie den Verweis auf eine Instanz einer inneren Klasse übergeben, übergeben Sie auch einen Verweis auf die äußere Klasse.

Verwandte Themen