用内部类注解类

p4tfgftt  于 2021-07-09  发布在  Java
关注(0)|答案(3)|浏览(224)

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

@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。
那么,是否有可能引用嵌套类呢?

l7mqbcuq

l7mqbcuq1#

您使用的是一个非静态嵌套类,其作用域为枚举的各个示例。
相反,您需要一个静态嵌套类,如下所示:

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);
    }
}
jjhzyzn0

jjhzyzn02#

从评论中。。。显然地

@Factory(Foo.FooFactory.class)

是需要的。

zour9fqk

zour9fqk3#

在显示注解时,foofactory未定义,因此需要指定完整路径:

@Factory(Foo.FooFactory.class)

相关问题