Plusieurs classes les mêmes ? (en java)

Résolu/Fermé
tnorange Messages postés 7 Date d'inscription mercredi 23 avril 2014 Statut Membre Dernière intervention 15 mai 2014 - 4 mai 2014 à 18:48
tnorange Messages postés 7 Date d'inscription mercredi 23 avril 2014 Statut Membre Dernière intervention 15 mai 2014 - 14 mai 2014 à 22:39
Bonjour !

Je me posait une question auquel aucune réponse n'a été apporté !
Pourquoi dans un projet java il y a plusieurs fois la même classe avec des noms différents, est-ce un problème ou pas ?

exemple :

Interface$1.class
Interface$2.class
Interface$3.class
Interface$4.class
Interface$5.class
Interface$6.class
Interface$7.class
Interface$8.class
Interface$9.class
Interface$10.class
Interface$11.class
Interface$12.class
Interface$13.class
Interface$14.class
Interface$15.class
Interface$16.class
Interface$17.class
Interface$18.class
Interface$19.class
Interface$20.class
Interface$21.class
Interface$22.class
Interface$23.class
Interface$23.class
(Et dans mon projet, il n'y a qu'une seule classe interface ?)

ou encore dans le même projet :

TestL1P1$1.class
TestL1P1$2.class
TestL1P1$3.class

Est-ce que quelqu'un serait pourquoi il a ça ?
Est-ce un problème ou pas ?
A voir également:

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
4 mai 2014 à 23:45
Bonjour,

Ce sont des classes anonymes. Cela arrive lorsque tu fais par exemple un code Swing comme ceci :

JButton button = new JButton("Ok");
button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        System.out.println(e);
    }
}

Au moment de la compilation Java remplace ce code par un autre plus ou moins équivalent que l'on pourrait transcrire comme ceci :

public class MaClasse$1 implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        System.out.println(e);
    }
}

JButton button = new JButton("Ok");
button.addActionListener(new MaClasse$1());

Tes classes anonymes $1, $2, $3 sont donc tout à fait normales. Tu pourras également trouver des .class nommés "Interface$Toto" si tu fais par exemple :

public class Interface
{
    public static class Toto
    {
    }
}

Dans ce cas ce ne sont plus des classes anonymes (vu qu'elles ont un nom) c'est ce que l'on appelle des classes internes.

Remarque : il est tout à fait possible de voir des classes locales (internes ou anonymes) imbriquées de telle sorte que l'on ait plusieurs $ dans un même nom de fichier .class

Exemple :

import java.awt.event.*;
import java.util.*;
import javax.swing.*;

public class Test // Test.class
{
    public static class Toto // Test$Toto.class
    {
        JButton button;
        List<String> list;
        
        public Toto()
        {
            list = new ArrayList<String>();
            
            button = new JButton("Trier");
            button.addActionListener(new ActionListener() // Test$Toto$1.class
            {
                // Test$Toto$1$1.class
                private Comparator<String> comp = new Comparator<String>()
                {
                    @Override
                    public int compare(String s1, String s2)
                    {
                        return s1.compareToIgnoreCase(s2);
                    }
                };
                
                @Override
                public void actionPerformed(ActionEvent e)
                {
                    Collections.sort(list, comp);
                }
            });
        }
    }
}

Note : vu que le $ est utilisé en interne par Java, il vaut mieux éviter de l'utiliser soi même dans ses noms de classes, méthodes ou variables, même s'il est autorisé par le compilateur.
1
tnorange Messages postés 7 Date d'inscription mercredi 23 avril 2014 Statut Membre Dernière intervention 15 mai 2014
14 mai 2014 à 22:39
Merci pour ton explication qui est précise :) Bonne soirée !
0