2012-08-24 13 views
5

tworzę moje enums przez odbicie, na które mogę dodać do każdej wyliczenia wewnętrzna klasy, która implementuje Abstract Factory. Teraz chcę, aby uzyskać dostęp do tej wewnętrznej klasy w celu wywołania metody:klasa Annotate z wewnętrznym klasy

@Factory(FooFactory.class) 
public enum Foo { 

    FOO, BAR; 

    public class FooFactory implements AbstractFactory<Foo> { 

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

Definicja @Factory jest:

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

     Class<?> value(); 
} 

Z tym jednak, że pojawia się następujący błąd:

Klasy nie można rozstrzygnąć na typ FooFactory.java

Kiedy próbuję @Factory(Foo$FooFactory.class) Otrzymuję błąd :

zagnieżdżona Foo $ FooFactory nie można referneced użyciu jego nazwy binarnej.

Czy możliwe jest odniesienie do klasy zagnieżdżonej?

+0

Podejrzewam, że FooFactory musi być 'public static class'. – Charlie

+0

@ Charlie Próbowałem już tego. –

+1

wyliczenia są zwykle dla stałych, znanych wartości. Wydaje się to trochę dziwne. –

Odpowiedz

7

Z uwag ... widocznie

@Factory(Foo.FooFactory.class) 

było potrzebne.

4

Używasz niestatycznej klasy zagnieżdżonej, która jest dopasowana do poszczególnych wystąpień wyliczenia.

Zamiast tego trzeba statycznych zagnieżdżone klasy, tak jak poniżej:

public static class FooFactory implements AbstractFactory<Foo> { 

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

Jednak wszystko to jest zbędne: można po prostu zadzwonić Foo.valueOf(value) aby osiągnąć ten cel. Nie widzę tu żadnej wartości dodanej (gra słów nie jest przeznaczona).

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

Potem masz coś innego, o czym nam nie mówisz. Udało mi się sprawić, że twoja konfiguracja zadziała. Będę edytować w przykładach kodu. – corsiKa

+0

To rzeczywiście działa, ale nie ma nic wspólnego z "statycznym" modyfikatorem. –

3

W momencie gdy prezentowane jest adnotacja, FooFactory jest niezdefiniowany, więc pełna ścieżka musi być określona:

@Factory(Foo.FooFactory.class) 
Powiązane problemy