Używam Eclipse jako mojego środowiska programistycznego. Używam go również do eksportu mojej aplikacji do pliku .jar. Kiedy patrzę na moje klasy w pliku .jar, kilka z nich zawiera nazwę tej klasy, znak dolara, a następnie liczbę. Przykład:
- Znajdź klasę $ 1.class
- Znajdź $ 2.class
- Znajdź $ 3.class
- Find.class
Zauważyłem, że robi to na większych klasach. Czy to dlatego, że klasy stają się tak duże, że kompiluje je w wiele klas? Wyszukałem w Google i przeglądałem wiele forów, przeszukałem dokumentację Java, ale nie znalazłem niczego, nawet co z nią związane. Czy ktoś mógłby to wyjaśnić?
java
class
compilation
Frizinator
źródło
źródło
Odpowiedzi:
Klasy wewnętrzne, jeśli istnieją w twojej klasie, zostaną skompilowane, a plik klasy będzie
ClassName$InnerClassName
. W przypadku klas wewnętrznych Anonymous pojawi się jako liczby. Rozmiar klasy (kod Java) nie prowadzi do generowania wielu klas.Np. Podając ten fragment kodu:
public class TestInnerOuterClass { class TestInnerChild{ } Serializable annoymousTest = new Serializable() { }; }
Klasy, które zostaną wygenerowane, to:
TestInnerOuterClass.class
TestInnerOuterClass$TestInnerChild.class
TestInnerOuterCasss$1.class
Aktualizacja:
Używanie klasy anonimowej nie jest uważane za złą praktykę, zależy tylko od sposobu użycia.
Sprawdź tę dyskusję na temat SO
źródło
Dzieje się tak, ponieważ masz anonimowe klasy w tej większej klasie. Są kompilowane przy użyciu tej konwencji nazewnictwa.
Zobacz Zagadka klasy anonimowej
źródło
Oprócz powyższych przypadków przedstawionych przez @mprabhat, innymi przypadkami mogą być:
Te przypadki są pochodnymi mojej inspekcji plików .class w jar.
źródło
Odpowiadając na twój komentarz, są złe zajęcia anonimowe. Z całą pewnością nie. Rozważ to, aby przypisać detektor akcji do JButton:
JButton button = new JButton(...); button.addActionListener(new ActionListener() { ... });
lub to zrobić sortowanie bez rozróżniania wielkości liter według właściwości "name"
Collections.sort( array, new Comparator<Foo>() { public int compare(Foo f1, Foo f2) { return f1.getName().toLowerCase().compareTo(f2.getName().toLowerCase()); } });
Zobaczysz także wiele klas Runnable i Calllable wykonanych jako klasy anonimowe.
źródło