2011-01-26 11 views
5

Estaba haciendo algunas pruebas jUnit y quería escribir distintas clases que tuvieran una funcionalidad similar pero que fueran lo suficientemente pequeñas como para escribir en una sola clase. Independientemente de la decisión de diseño, me llevó a un error de compilación. No estoy seguro de cuáles son las reglas para lo que vi.Las clases internas estáticas necesitan importación para las anotaciones

Se puede imaginar que sería algo como

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{ 

    } 
} 

Ahora, cuando se inicia el compilador se dirá TestClassOne no se puede resolver a un tipo. Hay una manera fácil de resolver esto. Se requeriría una importación explicita de la clase estática, por ejemplo.

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

Mi pregunta es, ¿puede alguien explicar qué compilador de reglas o razones puede haber para las anotaciones al no ser capaz de ver la clase interna estática clase. Tenga en cuenta que una clase privada de paquete se ve bien y compila sin importar.

Respuesta

5

Esta es una interesante. De acuerdo con [1], el alcance del nombre "TestClassOne" es "todo el cuerpo de" clase "TestSuite".

¿La anotación en es "el cuerpo de" TestSuite? Aparentemente no. Pero eso no es muy justo. La regla de alcance se definió antes de que se introdujera la anotación. No veo ningún problema si se considera una anotación de clase en el alcance de la clase. Son muy íntimos de todos modos.

Otra pregunta es ¿cómo se puede hacer referencia al nombre simple "TestSuite" en la anotación? Resulta que la especificación cubre este. La anotación es un modificador, que forma parte de la declaración de tipo, y "El alcance de un tipo de nivel superior es tipo declaraciones en el paquete".

Sin embargo, es posible que la especificación lo haya hecho por accidente. Las reglas se definieron antes de que se introdujera la anotación, y siguen siendo las mismas después. Entonces, aunque cubre el caso en el aspecto técnico, podría ser un accidente. Esto no es para dudar del poder del cerebro de los diseñadores de idiomas: toda la especificación es demasiado compleja.

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

+0

Bien explicado, gracias. –

5

No es necesario importar la clase interna, se puede acceder a ellos utilizando

TestSuite.TestClassOne 

Los detalles se pueden encontrar en JLS, pero mi regla es simple: Una importación a.b.c.d.e le permite utilizar en su lugar e del nombre completo. No le permite usar f.

+0

Lo suficiente, puedo hacer referencia a la clase y luego a su clase infantil. Mi objeción fue más al hecho de que puede, dentro de la clase, hacer referencia a su clase estática secundaria sin calificarla con su propio nombre de clase. Estaba buscando la razón por la que necesita el calificador –

+0

que veo. Dentro de la clase es como si hubiera importado todo de la clase, incluidas las clases internas. – maaartinus

2

Sólo una información adicional: es necesario importar las clases internas no sólo cuando se utiliza anotaciones, sino también cuando se utiliza como un tipo paramétrico, que es muy molesto.

Cuestiones relacionadas