Plusieurs classes les mêmes ? (en java)

Résolu
tnorange Messages postés 7 Statut Membre -  
tnorange Messages postés 7 Statut Membre -
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. KX Messages postés 19031 Statut Modérateur 3 020
     
    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
    1. tnorange Messages postés 7 Statut Membre
       
      Merci pour ton explication qui est précise :) Bonne soirée !
      0