2011-12-21 15 views
6

De acuerdo con el JLS:¿Por qué todas las clases anónimas son implícitamente finales?

15.9.5 Declaraciones Una declaración de la clase anónima clase anónima se deriva automáticamente de una expresión creación de la instancia de clase por el compilador.

Una clase anónima nunca es abstracta (§8.1.1.1). Una clase anónima es siempre una clase interna (§8.1.3); nunca es estático (§8.1.1, §8.5.2). Una clase anónima siempre es implícitamente final (§8.1.1.2).

Parece que fue una decisión de diseño específica, por lo que es probable que tenga algo de historia.

Si elige tener una clase como esta:

SomeType foo = new SomeType() { 
    @Override 
    void foo() { 
     super.foo(); 
     System.out.println("Hello, world!"); 
    } 
}; 

¿Por qué no se me permite hacerla una subclase de nuevo si así lo deseo?

SomeType foo = new SomeType() { 
    @Override 
    void foo() { 
     super.foo(); 
     System.out.println("Hello, world!"); 
    } 
} { 
    @Override 
    void foo() { 
     System.out.println("Hahaha, no super foo for you!"); 
    } 
}; 

No estoy diciendo que necesariamente quiero, o incluso puedo pensar en una razón por la que lo haría. Pero tengo curiosidad de por qué este es el caso.

+0

¿Tomaría "la sintaxis no lo permite"? ;-) Esa podría ser la razón por la que dijeron "_implicitly_ final" ... solo adivinar. –

+1

cuando se compilan, no son anónimos ni privados. Sin embargo, todavía contienen metadatos y hacerlos definitivos no garantiza que existan casos súper raros (ampliándolos) – bestsss

+0

@David, también hay una razón técnica – bestsss

Respuesta

6

Bueno, sería bastante inútil para poder subclase una clase anónima. El único lugar donde podría referirse a la clase anónima estaría en la declaración donde está definido (como muestra su hipotético ejemplo de pseudocódigo). Esto significa que se garantizará que el programa nunca creará instancias de la superclase anónima y que un compilador inteligente podrá colapsar las dos definiciones en una clase.

Más prácticamente, cuando una clase es definitiva, los compiladores y las máquinas virtuales son libres de alinear sus métodos en los sitios de llamadas. Entonces, en cualquier situación donde es naturalmente imposible extender una clase dada, tiene sentido hacer que tales clases sean intrínsecamente definitivas.

+1

Hay instancias, especialmente en el código de prueba (burla, espionaje) donde sería útil subclasificar una clase anónima. – steventrouble

Cuestiones relacionadas