2011-01-26 20 views
5

Così stavo facendo alcuni test di jUnit e volevo scrivere classi distinte che avevano funzionalità simili ma erano abbastanza piccole da scrivere all'interno di una singola classe. Indipendentemente dalla decisione di progettazione, mi ha portato a un errore del compilatore non sono sicuro di quali siano le regole per ciò che ho visto.Le classi interne statiche devono essere importate per le annotazioni

Si può immaginare che sarebbe simile a

package foo; 

@RunWith(Suite.class) 
@SuiteClasses({ TestClassOne.class, TestClassTwo.class }) 
public class TestSuite{ 

    @RunWith(SpringJUnit4ClassRunner.class) 
    public static class TestClassOne{ 

    } 

    @RunWith(SpringJUnit4ClassRunner.class) 
    public static class TestClassTwo{ 

    } 
} 

Ora, quando il compilatore calci dirà TestClassOne non può essere risolto a un tipo. C'è un modo semplice per risolvere questo. Per esempio, richiederebbe un'importazione esplicita della classe statica.

import foo.TestSuite.TestClassOne; 
import foo.TestSuite.TestClassTwo; 

La mia domanda è, chiunque può spiegare che cosa compilatore regole o le ragioni ci possono essere per le annotazioni di non essere in grado di vedere la classe interna statica della classe. Tieni presente che una classe privata del pacchetto viene visualizzata correttamente e viene compilata senza un'importazione.

risposta

5

Questo è interessante. Secondo [1], l'ambito del nome "TestClassOne" è "l'intero corpo" della classe "TestSuite".

L'annotazione in "il corpo di" TestSuite? Apparentemente no. Ma non è molto giusto. La regola dell'ambito è stata definita prima dell'introduzione dell'annotazione. Non vedo alcun problema se un'annotazione di classe è considerata nell'ambito della classe. Sono comunque molto intimi.

Un'altra domanda è come si può fare riferimento al nome semplice "TestSuite" nell'annotazione? Si scopre che le specifiche coprono questo. L'annotazione è un modificatore, che fa parte della dichiarazione del tipo, e "L'ambito di un tipo di livello superiore è tutte le dichiarazioni di tipo nel pacchetto".

Tuttavia è possibile che le specifiche siano state corrette per sbaglio. Le regole sono state definite prima dell'introduzione dell'annotazione e rimangono le stesse in seguito. Quindi, anche se copre il caso in termini tecnici, potrebbe essere un incidente. Questo non mette in dubbio il potere del cervello dei progettisti di linguaggi - l'intera serie è semplicemente troppo dannatamente complessa.

[1] http://java.sun.com/docs/books/jls/third_edition/html/names.html#6.3

+0

Ben spiegato, grazie. –

5

Non è necessario importare la classe interna, si potrebbe accedervi utilizzando

TestSuite.TestClassOne 

I dettagli possono essere trovati in JLS, ma la mia semplice regola è: un import a.b.c.d.e consente di utilizzare e invece del nome completo. Non ti consente di utilizzare f.

+0

Abbastanza corretto, posso fare riferimento alla classe quindi alla sua classe figlio. La mia obiezione riguardava più il fatto che è possibile, all'interno della classe, fare riferimento alla sua classe statica figlio senza qualificarla con il proprio nome di classe. Stavo cercando il motivo per cui hai bisogno del qualificatore –

+0

che vedo. All'interno della classe è come se avessi importato tutto dalla classe, incluse le classi interne. – maaartinus

2

Just an informazioni aggiuntive: è necessario importare le classi interne non solo quando si usano le annotazioni, ma anche quando lo si usa come un tipo parametrico, che è molto fastidioso.

Problemi correlati