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;
}
}
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();
}
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 }
Il s'appelle anonymous
type/class qui implémente cette interface. Jetez un coup d'œil au didacticiel - Classes internes locales et anonymes .
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.
Il existe quelque chose appelé classe anonyme en Java http://www.Java2s.com/Code/Java/Class/Anonymous-class.htm
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!
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.
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.