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;
    }
}

0voto

Marcelo Points 2723

Remarquez où les accolades s'ouvrent - vous déclarez un objet interne (appelé anonymous class ) qui met en œuvre ContentVisitor et toutes les méthodes requises sur place !

0voto

Shashank Kadne Points 4531

Il s'agit de l'implémentation d'une 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 pour permettre aux programmeurs Oxygene de travailler avec ces événements basés sur l'interface de la même manière que les programmeurs Java.

0voto

Kris Points 3826

Vous venez en fait de fournir l'implémentation de cette interface de manière anonyme. C'est assez courant et bien sûr possible. Jetez un coup d'oeil ici pour plus d'informations.

0voto

dos4dev Points 28

Puisque la question est toujours d'actualité et que Java 8 a introduit les lambdas. Je dois le mentionner. Lambda, comparé à AIC, présente quelques avantages.

  • lisibilité / introduction à la programmation fonctionnelle.
  • dans certains cas performance.

Mais lambda et AIC ont une portée différente. Vous ne pouvez pas créer une instance de Lambda et obtenir une référence à Lambda lui-même.

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