Plusieurs classes les mêmes ? (en java)

Résolu
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 ?

1 réponse

  1. Modérateur
    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. Merci pour ton explication qui est précise :) Bonne soirée !