2012-02-06 9 views
46

Estaba leyendo un código fuente de las bibliotecas de Java, y estoy confundido aquí;Java: Interfaz con nueva palabra clave ¿cómo es posible?

Este código es de Document.java en la biblioteca jaxb, y ContentVisitor es una interfaz en el mismo paquete, ¿cómo podemos crear una instancia de interfaz con una palabra clave nueva? ¿No es eso ilegal?

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

Acabas de descubrir, probablemente, una de las funciones más potentes del lenguaje de programación Java. – Mersenne

Respuesta

46

En el código, no se va a crear una instancia de la interfaz. Más bien, el código define una clase anónima que implementa la interfaz y crea una instancia de esa clase.

El código es más o menos 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

gracias ¿esta sintaxis (clase anónima) solo nos ahorra escribir algún código adicional o tiene otras ventajas o usos también? –

+0

Le ahorra tener que escribir un código adicional y crear un nombre. Es más probable que el nombre sea 'Documento $ 1' en el ejemplo anterior. –

+1

@DesignCode: es principalmente azúcar sintáctica, pero también tiene puntos de venta únicos. Por ejemplo, si tal clase se define dentro de una función, puede acceder a las variables 'finales 'definidas dentro de la función. – NPE

0

Esa declaración realmente crea una nueva clase anónima que implementa la interfaz ContentVisitor y luego su instancia para ese ámbito dado y es perfectamente válida.

0

dan cuenta cuando las llaves abiertas - que está declarando un objeto interno (llamado anonymous class) que implementa ContentVisitor y todos los métodos necesarios sobre el terreno!

0

Es la implementación de la interfaz en línea. Aquí la idea es hacer que el compilador genere una clase anónima que implemente la interfaz. Luego, para cada método definido en la interfaz, puede (opcionalmente) proporcionar un método con una firma adecuada que se utilizará como la implementación del método de la interfaz.

Es la nueva sintaxis de Oxygene, agregada al lenguaje para permitir a los programadores de Oxygene trabajar con estos eventos basados ​​en interfaz de forma muy similar a como lo hacen los programadores de Java.

10

Es válido. Se llama clase anónima. See here

Ya hemos visto ejemplos de la sintaxis para definir y crear instancias de una clase anónima. Podemos expresar que la sintaxis más formalmente como:

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

o:

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

+1 tnx buen enlace –

0

En realidad se acaba siempre que la implementación de esta interfaz de forma anónima. Esto es bastante común y por supuesto posible. Eche un vistazo a here para más información.

Cuestiones relacionadas