我通过反射创建枚举,为此我向每个枚举添加了一个实现抽象工厂的内部类。现在我想访问这个内部类以调用方法:
@Factory(FooFactory.class)
public enum Foo {
FOO, BAR;
public class FooFactory implements AbstractFactory<Foo> {
public Foo create(String value) {
return valueOf(value.toUpperCase());
}
}
}
@Factory
的定义是:
@Retention(RetentionPolicy.RUNTIME)
public @interface Factory {
Class<?> value();
}
但是,我收到以下错误:
类无法解析为类型FooFactory.java
当我尝试@Factory(Foo$FooFactory.class)
时,我收到错误:
无法使用其二进制名称引用嵌套的Foo $ FooFactory。
甚至可以引用嵌套类?
答案 0 :(得分:9)
从评论中......显然是
@Factory(Foo.FooFactory.class)
是必要的。
答案 1 :(得分:4)
您正在使用非静态嵌套类,该类的范围限定为枚举的各个实例。
相反,您需要一个静态嵌套类,如下所示:
public static class FooFactory implements AbstractFactory<Foo> {
public static Foo create(String value) {
return valueOf(value.toUpperCase());
}
}
但是,所有这些都是多余的:您只需致电Foo.valueOf(value)
即可实现此目标。我没有在这里看到任何增值(没有双关语)。
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);
}
}
答案 2 :(得分:3)
在您的注释出现时,FooFactory未定义,因此需要指定完整路径:
@Factory(Foo.FooFactory.class)