J'utilise Eclipse comme IDE de développement. Je l'utilise également pour exporter mon application dans un fichier .jar. Lorsque je regarde mes classes dans le fichier .jar, certaines de mes classes contiennent le nom de cette classe, un signe dollar, puis un nombre. Exemple:
J'ai remarqué qu'il le fait sur des classes plus importantes. Est-ce parce que les classes deviennent si grandes qu'elles le compilent en plusieurs classes? J'ai cherché sur google et consulté plusieurs forums, et j'ai cherché dans la documentation Java mais je n'ai rien trouvé de similaire). Quelqu'un pourrait-il expliquer?
Les classes internes, le cas échéant présentes dans votre classe, seront compilées et le fichier de classe sera ClassName$InnerClassName
. Dans le cas des classes internes anonymes, elles apparaîtront sous forme de nombres. La taille de la classe (code Java) ne conduit pas à la génération de plusieurs classes.
Par exemple. étant donné ce morceau de code:
public class TestInnerOuterClass {
class TestInnerChild{
}
Serializable annoymousTest = new Serializable() {
};
}
Les classes qui seront générées seront:
TestInnerOuterClass.class
TestInnerOuterClass$TestInnerChild.class
TestInnerOuterCasss$1.class
Mise à jour:
L'utilisation d'une classe anonyme n'est pas considérée comme une mauvaise pratique, elle dépend simplement de l'utilisation.
Vérifiez ceci discussion sur SO
C'est parce que vous avez des classes anonymes dans cette classe plus grande. Ils sont compilés à l'aide de cette convention de dénomination.
En plus des cas ci-dessus présentés par @mprabhat, les autres cas pourraient être:
Ces cas sont des dérivations de mon inspection sur les fichiers .class en pot.
Pour répondre à votre commentaire, les classes anonymes sont mauvaises. Ils ne le sont certainement pas. Considérez ceci pour affecter un écouteur d'action à un JButton:
JButton button = new JButton(...);
button.addActionListener(new ActionListener() { ... });
ou ceci pour faire un tri insensible à la casse par la propriété "name"
Collections.sort( array, new Comparator<Foo>() {
public int compare(Foo f1, Foo f2) {
return f1.getName().toLowerCase().compareTo(f2.getName().toLowerCase());
}
});
Vous verrez également beaucoup de Runnable et Callable faites comme des classes anonymes.