2012-08-24 19 views
5

Creo mi enumeraciones a través de la reflexión , para que añado a cada una enumeración de una clase interna que implementa el fábrica abstracta. Ahora quiero ver esta clase interna con el fin de invocar el método:clase Anotar con clase interna

@Factory(FooFactory.class) 
public enum Foo { 

    FOO, BAR; 

    public class FooFactory implements AbstractFactory<Foo> { 

      public Foo create(String value) { 
       return valueOf(value.toUpperCase()); 
      } 
    } 
} 

La definición de @Factory es:

@Retention(RetentionPolicy.RUNTIME) 
public @interface Factory { 

     Class<?> value(); 
} 

Con esto, sin embargo, recibo el error siguiente:

La clase no se puede resolver en un tipo FooFactory.java

Cuando intento @Factory(Foo$FooFactory.class) recibo el error :

El anidada Foo $ FooFactory no puede ser referneced utilizando su nombre binario.

¿Es posible incluso hacer referencia a una clase anidada?

+0

Sospecho que FooFactory debe ser 'public static class'. – Charlie

+0

@Charlie Ya lo intenté. –

+1

las enumeraciones son generalmente para valores conocidos fijos. Esto parece un poco extraño. –

Respuesta

7

De los comentarios ... al parecer se necesitaba

@Factory(Foo.FooFactory.class) 

.

4

Está utilizando una clase anidada no estática, que tiene como ámbito las instancias individuales de la enumeración.

En cambio, necesita una clase anidada estática, así:

public static class FooFactory implements AbstractFactory<Foo> { 

     public static Foo create(String value) { 
      return valueOf(value.toUpperCase()); 
     } 
} 

Sin embargo, todo esto es redundante: sólo tiene que llamar Foo.valueOf(value) para lograr este objetivo. No veo ningún valor agregado aquí (sin juego de palabras).

Factory.java

import java.lang.annotation.*; 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Factory { 
     Class<?> value(); 
} 

FooEnum.java

@Factory(FooEnum.FooFactory.class) 
public enum FooEnum { 
    FOO, BAR; 
    public static class FooFactory { 

      public static FooEnum create(String value) { 
       return valueOf(value.toUpperCase()); 
      } 
    } 
} 

FooEnumMain.java

public class FooEnumMain { 
    public static void main(String[] args) { 
     FooEnum f = FooEnum.FooFactory.create("foo"); 
     System.out.println(f); 
    } 
} 
+0

Entonces tienes algo más en juego de lo que no nos estás hablando. Pude hacer que tu configuración funcione. Voy a editar en muestras de código. – corsiKa

+0

De hecho, funciona, pero no tiene nada que ver con el modificador 'static'. –

3

En el momento en que se presenta la anotación, FooFactory no está definido, por lo que la plena ruta necesita ser especificada:

@Factory(Foo.FooFactory.class) 
Cuestiones relacionadas