70 votes

Java : Interface avec nouveau mot-clé : comment est-ce possible ?

J'ai lu quelques codes sources de bibliothèques Java, et je suis confus ;

Ce code provient de Document.java dans la bibliothèque jaxb, et ContentVisitor est une interface dans le même paquet, comment pouvons-nous créer une instance d'Interface avec un nouveau mot-clé ? n'est-ce pas illégal ?

public final class Document {
.
.
 private final ContentVisitor visitor = new ContentVisitor() {
    public void onStartDocument() {

        throw new IllegalStateException();
    }

    public void onEndDocument() {
        out.endDocument();
    }

    public void onEndTag() {
        out.endTag();
        inscopeNamespace.popContext();
        activeNamespaces = null;
    }
}

76voto

NPE Points 169956

Dans le code, vous ne créez pas une instance de l'interface. Au contraire, le code définit une classe anonyme qui implémente l'interface, et instancie cette classe.

Le code est à peu près équivalent à :

public final class Document {

    private final class AnonymousContentVisitor implements ContentVisitor {

        public void onStartDocument() {
            throw new IllegalStateException();
        }

        public void onEndDocument() {
            out.endDocument();
        }

        public void onEndTag() {
            out.endTag();
            inscopeNamespace.popContext();
            activeNamespaces = null;
        }
    }

    private final ContentVisitor visitor = new AnonymousContentVisitor();
}

16voto

Nishant Points 22758

C'est valide. Ça s'appelle la classe anonyme. Voir ici

Nous avons déjà vu des exemples de la syntaxe permettant de définir et d'instancier une classe anonyme. Nous pouvons exprimer cette syntaxe de manière plus formelle comme suit :

new class-name ( [ argument-list ] ) { class-body }

ou :

new interface-name () { class-body }

2voto

AVD Points 57984

Il s'appelle anonymous type/classe qui implémente cette interface. Jetez un coup d'œil au tutoriel - Classes internes locales et anonymes .

1voto

Sanjay T. Sharma Points 12620

Cette déclaration crée en fait une nouvelle classe anonyme qui implémente la fonction ContentVisitor et ensuite son instance pour cette portée donnée et est parfaitement valide.

0voto

naresh Points 1545

Il y a quelque chose appelé classe anonyme en Java. http://www.java2s.com/Code/Java/Class/Anonymous-class.htm

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