2012-08-24 1 views
5

Creo il mio enumerazioni attraverso riflessione, per questo aggiungo ad ogni enum una classe interna che implementa l'Abstract Factory . Ora voglio accedere a questa classe interna, al fine di richiamare il metodo:classe Annotate con classe 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 definizione di @Factory è:

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

     Class<?> value(); 
} 

Con questo, però, ricevo il seguente errore:

Classe non risolvibile con un tipo FooFactory.java

Quando provo @Factory(Foo$FooFactory.class) ricevo l'errore :

Il nidificato Foo $ FooFactory non può essere referneced utilizzando il suo nome binario.

Quindi è possibile anche fare riferimento a una classe annidata?

+0

Sospetto che FooFactory debba essere "public static class". – Charlie

+0

@ Charlie l'ho già provato. Le enumerazioni –

+1

di solito sono per valori fissi noti. Questo sembra strano. –

risposta

7

Dai commenti ... a quanto pare

@Factory(Foo.FooFactory.class) 

era necessario.

4

Si sta utilizzando una classe nidificata non statica, che ha ambito per le singole istanze dell'enumerazione.

Invece, è necessaria una classe innestata statica, in questo modo:

public static class FooFactory implements AbstractFactory<Foo> { 

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

Tuttavia, tutto questo è ridondante: si può semplicemente chiamare Foo.valueOf(value) per raggiungere questo obiettivo. Non vedo alcun valore aggiunto qui (nessun gioco di parole previsto).

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

Poi hai qualcos'altro che non ci stai dicendo. Sono riuscito a far funzionare la configurazione. Modificherò in campioni di codice. – corsiKa

+0

Funziona davvero, ma non ha nulla a che fare con il modificatore 'static'. –

3

Nel momento in cui l'annotazione è presentato, FooFactory non è definito, in modo che il pieno percorso deve essere specificato:

@Factory(Foo.FooFactory.class)