web-dev-qa-db-fra.com

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

Je lisais un code source à partir de bibliothèques Java, et je suis confus ici;

Ce code provient de Document.Java dans la bibliothèque jaxb et ContentVisitor est une interface dans le même package, comment 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;
    }
}
50
user893334

Dans le code, vous ne créez pas d'instance de l'interface. Le code définit plutôt 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();
}
50
NPE

C'est valide C'est ce qu'on appelle la classe anonyme. Vois ici

Nous avons déjà vu des exemples de syntaxe permettant de définir et d'instancier une classe anonyme. Nous pouvons exprimer cette syntaxe plus formellement par:

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

ou:

new interface-name () { class-body }
11
Nishant

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

2
adatapost

Cette déclaration crée en fait une nouvelle classe anonyme qui implémente l'interface ContentVisitor, puis son instance pour cette étendue donnée et est parfaitement valide.

1
Sanjay T. Sharma

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

0
naresh

Remarquez où les accolades sont ouvertes - vous déclarez un objet interne (appelé anonymous class) qui implémente ContentVisitor et toutes les méthodes requises immédiatement!

0
Marcelo

Il s'agit d'une implémentation d'interface en ligne. L'idée est de faire en sorte que le compilateur génère une classe anonyme qui implémente l'interface. Ensuite, pour chaque méthode définie dans l'interface, vous pouvez (facultativement) fournir une méthode avec une signature appropriée qui sera utilisée comme implémentation de la méthode de l'interface.

Il s'agit de la nouvelle syntaxe Oxygene, ajoutée au langage afin de permettre aux programmeurs Oxygene de travailler avec ces événements basés sur une interface de la même manière que les programmeurs Java.

0
Shashank Kadne

En fait, vous venez de fournir l'implémentation de cette interface de manière anonyme. Ceci est assez courant et bien sûr possible. Regardez ici pour plus d'informations.

0
Kris