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)ただし、これはすべて冗長です。この目標を達成するために電話をかけるだけです。ここに付加価値はありません(しゃれは意図されていません)。

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);
    }
}
于 2012-08-24T21:57:38.037 に答える
3

注釈が表示された時点では、FooFactoryは未定義であるため、フルパスを指定する必要があります。

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