Ostatnie pole i anonimowa klasa
Nadal nie jestem zadowolony z wyjaśnień dotyczących anonimowej klasy i ostatniego pola. Było mnóstwo pytań próbujących wyjaśnić oczywisty problem, ale nie znalazłem odpowiedzi na wszystkie moje pytania :-)
Załóżmy następujący kod:
public void method(final int i, int j) {
final int z = 6;
final int x = j;
int k = 5;
new Runnable() {
public void run() {
System.out.print(i);
System.out.print(x);
System.out.print(z);
System.out.print(k);
}
};
}
Nie można skompilować tego kodu z powodu „unfinal”k
własność.Rozumiem, że kompilator może zastąpićz
właściwość o zadeklarowanej wartości podczas kompilacji.Kiedy szukałem rozwiązania, jak dokładnie może działaći
ix
znalazłem toodpowiedź który mówi:
Kompilator może wtedy zastąpić użycie lastPrice i price w anonimowej klasie wartościami stałych (w czasie kompilacji, oczywiście), a nie będziesz mieć problemu z dostępem do nieistniejących zmiennych
Jak to może działać na polachi
ix
jeśli są to parametry metody? Nie są znane podczas kompilacji? Takie podejście może działaćz
.
Z drugiej strony, istnieje wyjaśnienie dotycząceproblemy ze stosem:
Pozwala to kompilatorowi Java „przechwycić” wartość zmiennej w czasie wykonywania i zapisać kopię jako pole w klasie wewnętrznej. Po zakończeniu zewnętrznej metody i usunięciu ramki stosu oryginalna zmienna zniknie, ale prywatna kopia klasy wewnętrznej pozostanie w pamięci własnej klasy
Zrozumiałbym, że klasa anonimowa w jakiś sposób skopiowała całą wymaganą zawartość (pola) podczas jej tworzenia. Brakującyfinal
ma oczywisty problem, jeśli jakiś kodponiżej anonimowa deklaracja klasy zmieniłaby wartość, możliwe wykonaniestale
wartości.
Ale ok, powinno to rozwiązać problem, gdy metoda klasy anonimowej jest wykonywana poza zakresem używanych właściwości.
Ale to podejście powinno działaćparzysty bezfinal
deklaracja, ponieważ po prostu kopiuje wszystkie pola.
Oba podejścia wydają mi się niezależne. A skoro o tym mowa - i to mogłoby rozwiązać moje pytania - nie znalazłem, jak działafinal
pole metody. Nie są usuwane ze stosu, nawet jeśli metoda zostanie ukończona? Wydaje mi się to nonsensem, ale wyjaśniałoby wiele rzeczy :-)
Jaka jest prawidłowa odpowiedz?