2012-02-06 24 views
46

Stavo leggendo qualche codice sorgente da librerie Java e sono confuso qui;Java: interfaccia con una nuova parola chiave come è possibile?

Questo codice proviene da Document.java nella libreria jaxb e ContentVisitor è un'interfaccia nello stesso pacchetto, come possiamo creare un'istanza di Interface con una nuova parola chiave? non è illegale?

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

Hai appena scoperto, probabilmente, una delle funzionalità più potenti del linguaggio di programmazione Java. – Mersenne

risposta

46

Nel codice, non si sta creando un'istanza dell'interfaccia. Piuttosto, il codice definisce una classe anonima che implementa l'interfaccia e crea un'istanza di quella classe.

Il codice è approssimativamente equivalente a:

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(); 
} 
+0

grazie questa sintassi (classe anonima) ci salva solo dalla scrittura di un codice extra o ha altri vantaggi o usi? –

+0

Si risparmia dover scrivere un codice aggiuntivo e ottenere un nome. Il nome è più probabile che sia "Document $ 1" nell'esempio sopra. –

+1

@DesignCode: è principalmente zucchero sintattico, ma ha anche punti vendita unici. Ad esempio, se tale classe è definita all'interno di una funzione, può accedere alle variabili 'final' definite all'interno della funzione. – NPE

0

Quella dichiarazione crea in realtà una nuova classe anonima che implementa l'interfaccia ContentVisitor e quindi l'istanza per tale ambito specificato ed è perfettamente valida.

0

proprio a scoprire dove le parentesi graffe aperte - si dichiara un oggetto interno (chiamato anonymous class) che implementa ContentVisitor e tutti i metodi necessari sul posto!

0

È l'implementazione dell'interfaccia inline.Here l'idea è di fare in modo che il compilatore generi una classe anonima che implementa l'interfaccia. Quindi per ogni metodo definito nell'interfaccia è possibile (facoltativamente) fornire un metodo con una firma appropriata che verrà utilizzata come implementazione del metodo dell'interfaccia.

È la nuova sintassi Oxygene, aggiunta al linguaggio per consentire ai programmatori Oxygene di lavorare con questi eventi basati sull'interfaccia più o meno allo stesso modo dei programmatori Java.

10

È valido. Si chiama classe anonima. See here

Abbiamo già visto esempi della sintassi per la definizione e l'istanziazione di una classe anonima. Possiamo esprimere che la sintassi più formalmente come:

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

o:

new interface-name() { class-body } 
+0

+1 collegamento piacevole tnx –

0

in realtà hanno appena fornito l'attuazione di questa interfaccia in forma anonima. Questo è abbastanza comune e, naturalmente, possibile. Date un'occhiata allo here per maggiori informazioni.

Problemi correlati