Java Language Classes internes anonymes


Exemple

Une classe interne anonyme est une forme de classe interne déclarée et instanciée avec une seule instruction. En conséquence, il n'y a pas de nom pour la classe qui peut être utilisé ailleurs dans le programme; c'est à dire qu'il est anonyme.

Les classes anonymes sont généralement utilisées dans les situations où vous devez pouvoir créer une classe légère à transmettre en tant que paramètre. Cela se fait généralement avec une interface. Par exemple:

public static Comparator<String> CASE_INSENSITIVE =
        new Comparator<String>() {
            @Override
            public int compare(String string1, String string2) {
                return string1.toUpperCase().compareTo(string2.toUpperCase());
            }
        };

Cette classe anonyme définit un objet Comparator<String> ( CASE_INSENSITIVE ) qui compare deux chaînes en ignorant les différences dans la casse.

Les autres interfaces fréquemment implémentées et instanciées à l'aide de classes anonymes sont Runnable et Callable . Par exemple:

// An anonymous Runnable class is used to provide an instance that the Thread
// will run when started.
Thread t = new Thread(new Runnable() {
        @Override 
        public void run() {
              System.out.println("Hello world");
        }
    });
t.start();  // Prints "Hello world"

Les classes internes anonymes peuvent également être basées sur des classes. Dans ce cas, la classe anonyme extends implicitement la classe existante. Si la classe étendue est abstraite, la classe anonyme doit implémenter toutes les méthodes abstraites. Il peut également remplacer les méthodes non abstraites.

Constructeurs

Une classe anonyme ne peut pas avoir de constructeur explicite. Au lieu de cela, un constructeur implicite est défini qui utilise super(...) pour transmettre tous les paramètres à un constructeur de la classe en cours d'extension. Par exemple:

SomeClass anon = new SomeClass(1, "happiness") {
            @Override
            public int someMethod(int arg) {
                // do something
            }
        };

Le constructeur implicite de notre sous-classe anonyme de SomeClass appellera un constructeur de SomeClass correspondant à la signature d'appel SomeClass(int, String) . Si aucun constructeur n'est disponible, vous obtiendrez une erreur de compilation. Toutes les exceptions lancées par le constructeur correspondant sont également renvoyées par le constructeur implicite.

Naturellement, cela ne fonctionne pas lors de l'extension d'une interface. Lorsque vous créez une classe anonyme à partir d'une interface, la superclasse de classes est java.lang.Object qui ne possède qu'un constructeur no-args.