W Javie istnieją cztery typy klas zagnieżdżonych:
Static nested class nie ma dostępu do niestatycznych członów klasy zewnętrznej bezpośrednio. Jest kompilowana jako osobna klasa, a jej instancje nie przechowują ukrytej referencji do obiektu otaczającego.
Inner class (non-static) przechowuje niejawne odniesienie do zewnętrznego obiektu i może uzyskiwać dostęp do jego pól. Tego rodzaju klasy częściej wykorzystuje się do implementacji słuchaczy lub iteratorów z dostępem do danych obiektu zewnętrznego.
class Outer { static class Nested { // static void foo() {} } class Inner { // non-static void bar() { System.out.println(value); // dostęp do pola zewnętrznego } } int value = 42; }
Używaj static nested class do konstrukcji użytecznych lub pomocniczych, które są związane z klasą zewnętrzną znaczeniem, ale nie wymagają dostępu do jej stanu. Używaj inner class, jeśli potrzebujesz bezpośredniego dostępu do niestatycznych członów klasy zewnętrznej dla ściślejszej integracji.
Pytanie: „Czy static nested class może bezpośrednio odwoływać się do niestatycznych pól zewnętrznej klasy?”
Odpowiedź: Nie, static nested class nie może bezpośrednio odwoływać się do niestatycznych pól lub metod instancji zewnętrznej klasy, ponieważ nie zawiera (i nie przechowuje) odniesienia do obiektu klasy zewnętrznej.
Historia
W bibliotece do przechowywania danych w pamięci podręcznej użyto static nested class, zakładając możliwość dostępu do ustawień konfiguracyjnych klasy zewnętrznej. Po próbie dostępu wystąpił błąd kompilacji — klasa wewnętrzna nie widziała niestatycznych pól, co zmusiło do zmiany architektury.
Historia
W interfejsie aplikacji graficznej użyto inner class zamiast static nested class do stałych, co spowodowało dodatkowe niejawne odniesienie do zewnętrznego obiektu. W rezultacie, garbage collector nie mógł poprawnie oczyszczać pamięci, co prowadziło do wycieków.
Historia
Przy serializacji kolekcji zawierającej klasy wewnętrzne wystąpił problem: inner class przechowywała odniesienie do obiektu nadrzędnego, a podczas serializacji serializowane było całe drzewo zależności, znacznie spowalniając proces i zwiększając rozmiar wyniku. Po zmianie na static nested class problem zniknął.