W Javie zagnieżdżone klasy mogą być albo static
nie. Jeśli tak static
, nie zawierają odniesienia do wskaźnika instancji zawierającej (nie są już nazywane klasami wewnętrznymi, nazywane są klasami zagnieżdżonymi).
Zapomnienie o utworzeniu klasy zagnieżdżonej, static
gdy nie jest ona potrzebna, może prowadzić do problemów z usuwaniem elementów bezużytecznych lub analizą ucieczki.
Czy można również stworzyć anonimową klasę wewnętrzną static
? A może kompilator wykrywa to automatycznie (co może, ponieważ nie może być żadnych podklas)?
Na przykład, jeśli tworzę anonimowy komparator, prawie nigdy nie potrzebuję odniesienia do zewnątrz:
Collections.sort(list, new Comparator<String>(){
int compare(String a, String b){
return a.toUpperCase().compareTo(b.toUpperCase());
}
}
java
syntax
inner-classes
Thilo
źródło
źródło
Collections.sort(list, String.CASE_INSENSITIVE_ORDER)
działa od Java 2, przeczytaj, ponieważ istnieje API Collection…Odpowiedzi:
Nie, nie możesz i nie, kompilator nie może tego rozgryźć. Dlatego FindBugs zawsze sugeruje zmianę anonimowych klas wewnętrznych na nazwane
static
klasy zagnieżdżone, jeśli nie używają one swojego niejawnegothis
odwołania.Edycja: Tom Hawtin - tackline mówi, że jeśli klasa anonimowa jest tworzona w kontekście statycznym (np. W
main
metodzie), to w rzeczywistości klasa anonimowa jeststatic
. Ale JLS nie zgadza się :Glosariusz języka Java firmy Roedy Green mówi, że fakt, że klasy anonimowe są dozwolone w kontekście statycznym, zależy od implementacji:
Edycja 2: JLS w rzeczywistości obejmuje statyczne konteksty dokładniej w §15.9.2 :
Zatem klasa anonimowa w kontekście statycznym jest z grubsza równoważna
static
klasie zagnieżdżonej, ponieważ nie zachowuje odniesienia do klasy otaczającej, nawet jeśli technicznie nie jeststatic
klasą.źródło
true
przy użyciu javac (sun-jdk-1.7.0_10) ifalse
kompilatora Eclipse.Rodzaj. Anonimowa klasa wewnętrzna utworzona w metodzie statycznej będzie oczywiście faktycznie statyczna, ponieważ nie ma źródła dla zewnętrznej this.
Istnieją pewne techniczne różnice między klasami wewnętrznymi w kontekstach statycznych i statycznymi klasami zagnieżdżonymi. Jeśli jesteś zainteresowany, przeczytaj JLS 3rd Ed.
źródło
Myślę, że jest tu trochę zamieszania w nomenklaturze, co wprawdzie jest zbyt głupie i zagmatwane.
Jakkolwiek je nazwiesz, wszystkie te wzorce (i kilka odmian o różnej widoczności) są możliwe, normalna, legalna Java:
Są one uwzględnione w specyfikacji języka (jeśli naprawdę się tym przejmujesz, zobacz sekcję 15.9.5.1, aby uzyskać informacje na temat metody statycznej).
Ale ten cytat jest po prostu błędny :
Myślę, że cytowany autor myli statyczne słowo kluczowe ze statycznym kontekstem . (Trzeba przyznać, że JLS jest również nieco zagmatwany pod tym względem).
Szczerze mówiąc, wszystkie powyższe wzorce są w porządku (jakkolwiek je nazwiesz „zagnieżdżone”, „wewnętrzne”, „anonimowe” cokolwiek…). Naprawdę nikt nie zamierza nagle usunąć tej funkcjonalności w następnej wersji Javy. Szczerze!
źródło
new
iwJComponent
trzecim przykładzie.Klasy wewnętrzne nie mogą być statyczne - statyczna klasa zagnieżdżona nie jest klasą wewnętrzną. Poradnik Java mówi o tym tutaj .
źródło
anonimowe klasy wewnętrzne nigdy nie są statyczne (nie mogą deklarować metod statycznych ani nieostatecznych pól statycznych), ale jeśli są zdefiniowane w kontekście statycznym (metoda statyczna lub pole statyczne), zachowują się jako statyczne w tym sensie, że nie mogą dostęp do niestatycznych (tj. instancji) członków klasy otaczającej (jak wszystko inne z kontekstu statycznego)
źródło
Uwaga dotycząca uczynienia anonimowych klas wewnętrznych statycznymi przez wywołanie ich w ramach metody statycznej.
To faktycznie nie usuwa odniesienia. Możesz to przetestować, próbując serializować klasę anonimową i nie umożliwiając serializacji otaczającej klasy.
źródło