2011-12-21 13 views
6

Secondo il JLS:Perché tutte le classi anonime sono implicitamente definitive?

15.9.5 Anonymous Classe Dichiarazioni Una dichiarazione della classe anonima è derivato automaticamente da un'espressione di creazione istanza di classe dal compilatore.

Una classe anonima non è mai astratta (§8.1.1.1). Una classe anonima è sempre una classe interna (§8.1.3); non è mai statico (§8.1.1, §8.5.2). Una classe anonima è sempre implicitamente definitiva (§8.1.1.2).

Questa sembra una decisione di progettazione specifica, quindi è probabile che abbia qualche storia.

Se ho scelto di avere una classe come questa:

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

Perché non mi è concesso di sottoclasse di nuovo se lo desiderano?

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!"); 
    } 
}; 

Non sto dicendo che necessariamente voglio, o posso anche pensare a un motivo per cui lo farei. Ma sono curioso perché questo è il caso.

+0

Prenderesti "la sintassi non lo consente"? ;-) Questo potrebbe essere il motivo per cui hanno detto "_intlicitly_ final" ... solo a indovinare. –

+1

quando compilati non sono anonimi e non privati. Tuttavia contengono ancora i metadati e il loro completamento non garantisce casi super-strani (estendendoli) – bestsss

+0

@David, c'è anche un motivo tecnico – bestsss

risposta

6

Bene, sarebbe abbastanza inutile riuscire a creare una sottoclasse di classe anonima. L'unico punto in cui potreste fare riferimento alla classe anonima sarebbe nell'istruzione in cui è definito (come mostra il vostro ipotetico esempio di pseudocodice). Ciò significa che al programma sarebbe garantito di non creare mai alcuna istanza della superclasse anonima e che un compilatore intelligente dovrebbe essere in grado di comprimere le due definizioni in un'unica classe.

Più in pratica, quando una classe è definitiva, i compilatori e le macchine virtuali sono liberi di incorporare i propri metodi nei siti di chiamata. Quindi, in ogni situazione in cui è naturalmente impossibile estendere una determinata classe, ha senso rendere tali classi intrinsecamente definitive.

+1

Ci sono casi, specialmente nel test del codice (mocking, spying) in cui sarebbe utile sottoclasse una classe anonima. – steventrouble

Problemi correlati