Ich habe Eclipse als meine Entwicklungs-IDE verwendet. Ich verwende es auch, um meine Anwendung in eine JAR-Datei zu exportieren. Wenn ich mir meine Klassen in der JAR-Datei ansehe, enthalten einige meiner Klassen den Namen dieser Klasse, ein Dollarzeichen und dann eine Zahl. Beispiel:
- Finden Sie $ 1.class
- Finden Sie $ 2.class
- Finden Sie $ 3.class
- Find.class
Ich habe bemerkt, dass dies bei größeren Klassen der Fall ist. Liegt das daran, dass die Klassen so groß werden, dass sie in mehrere Klassen kompiliert werden? Ich habe in mehreren Foren gegoogelt und gesucht und die Java-Dokumentation durchsucht, aber nichts gefunden, was damit zu tun hätte. Könnte jemand erklären?
java
class
compilation
Frizinator
quelle
quelle
Antworten:
Innere Klassen, falls in Ihrer Klasse vorhanden, werden kompiliert und die Klassendatei wird
ClassName$InnerClassName
. Bei anonymen inneren Klassen werden diese als Zahlen angezeigt. Die Größe der Klasse (Java-Code) führt nicht zur Generierung mehrerer Klassen.ZB diesen Code gegeben:
public class TestInnerOuterClass { class TestInnerChild{ } Serializable annoymousTest = new Serializable() { }; }
Klassen, die generiert werden, sind:
TestInnerOuterClass.class
TestInnerOuterClass$TestInnerChild.class
TestInnerOuterCasss$1.class
Aktualisieren:
Die Verwendung einer anonymen Klasse wird nicht als schlechte Praxis angesehen, sondern hängt nur von der Verwendung ab.
Überprüfen Sie diese Diskussion auf SO
quelle
Dies liegt daran, dass Sie in dieser größeren Klasse anonyme Klassen haben. Sie werden mit dieser Namenskonvention kompiliert.
Siehe Das Rätsel der anonymen Klasse
quelle
Zusätzlich zu den oben von @mprabhat vorgestellten Fällen können die anderen Fälle sein:
Diese Fälle sind Ableitungen meiner Inspektion von .class-Dateien in jar.
quelle
Um Ihren Kommentar zu beantworten, sind anonyme Klassen schlecht. Sie sind definitiv nicht. Berücksichtigen Sie dies, um einem JButton einen Aktionslistener zuzuweisen:
JButton button = new JButton(...); button.addActionListener(new ActionListener() { ... });
oder dies, um eine Sortierung ohne Berücksichtigung der Groß- und Kleinschreibung nach der Eigenschaft "name" durchzuführen
Collections.sort( array, new Comparator<Foo>() { public int compare(Foo f1, Foo f2) { return f1.getName().toLowerCase().compareTo(f2.getName().toLowerCase()); } });
Sie werden auch viele Runnable und Callable als anonyme Klassen sehen.
quelle