94 votes

les classes compilées en java contiennent des signes de dollar

J'ai utilisé Eclipse comme IDE. Je l'utilise également pour exporter mon application dans un fichier JAR. Lorsque je regarde mes classes dans le fichier JAR, certaines d'entre elles contiennent le nom de la classe, un signe de dollar, puis un chiffre. Par exemple :

Find$1.class 
Find$2.class
Find$3.class
Find.class

J'ai remarqué qu'il fait ça sur les plus grandes classes. Est-ce parce que les classes sont si grandes qu'il les compile en plusieurs classes ? J'ai cherché sur Google, sur de nombreux forums et dans la documentation de Java, mais je n'ai rien trouvé qui y soit lié. Quelqu'un pourrait-il m'expliquer ?

123voto

mprabhat Points 11553

Les classes internes, si elles sont présentes dans votre classe, seront compilées et le fichier de classe sera ClassName$InnerClassName . Dans le cas des classes intérieures anonymes, il s'agira de chiffres. La taille de la classe (code Java) n'entraîne pas la génération de classes multiples.

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 :

  1. TestInnerOuterClass.class
  2. TestInnerOuterClass$TestInnerChild.class
  3. TestInnerOuterCasss$1.class

Mise à jour :

L'utilisation de classes anonymes n'est pas considérée comme une mauvaise pratique, cela dépend simplement de l'utilisation.

Vérifiez este discussion sur le SO

15voto

jjathman Points 2028

C'est parce que vous avez des classes anonymes à l'intérieur de cette grande classe. Elles sont compilées en utilisant cette convention de dénomination.

Voir L'énigme des classes anonymes

12voto

SGuru Points 589

En plus des cas ci-dessus présentés par @mprabhat, les autres cas pourraient être :

  1. si votre classe contient un enum variable, une classe distincte serait générée pour cela aussi. Le nom de la classe générée serait Nom de la classe$Nom_du_enum .
  2. Si votre classe X hérite d'une autre classe, c'est-à-dire l'étend. Y alors un fichier .class sera généré sous le nom de Nom de la classe$1.class o Nom de la classe$1$1.class
  3. Si votre classe X implémente une interface Y alors un fichier .class sera généré sous le nom de Nom de la classe$1.class o Nom de la classe$1$1.class .

Ces cas sont des dérivations de mon inspection sur les fichiers .class dans jar.

0voto

Matt Points 5441

Pour répondre à votre commentaire sur la question de savoir si les cours anonymes sont mauvais. Ils ne le sont certainement pas. Considérez ceci pour assigner 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é "nom".

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 réalisés en tant que classes anonymes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X