6

我通过反射创建我的枚举,为此我向每个枚举添加一个实现抽象工厂的内部类。现在我想访问这个内部类以调用该方法:

@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 不能使用其二进制名称来引用。

那么甚至可以引用嵌套类吗?

4

3 回答 3

9

从评论中......显然

@Factory(Foo.FooFactory.class)

需要。

于 2012-08-24T22:07:59.780 回答
4

您正在使用一个非静态嵌套类,它的作用域是枚举的各个实例。

相反,您需要一个静态嵌套类,如下所示:

public static class FooFactory implements AbstractFactory<Foo> {

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

然而,所有这些都是多余的:你可以简单地调用Foo.valueOf(value)来实现这个目标。我在这里看不到任何附加值(没有双关语)。

工厂.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);
    }
}
于 2012-08-24T21:57:38.037 回答
3

在出现注释时,FooFactory 未定义,因此需要指定完整路径:

@Factory(Foo.FooFactory.class)
于 2012-08-24T22:03:09.860 回答