定数から取得した列挙型をアノテーションのパラメーターとして使用できません。このコンパイルエラーが発生します:「アノテーション属性[属性]の値は列挙型定数式でなければなりません」。
これは、列挙型のコードの簡略化されたバージョンです。
public enum MyEnum {
APPLE, ORANGE
}
注釈の場合:
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD })
public @interface MyAnnotation {
String theString();
int theInt();
MyEnum theEnum();
}
そしてクラス:
public class Sample {
public static final String STRING_CONSTANT = "hello";
public static final int INT_CONSTANT = 1;
public static final MyEnum MYENUM_CONSTANT = MyEnum.APPLE;
@MyAnnotation(theEnum = MyEnum.APPLE, theInt = 1, theString = "hello")
public void methodA() {
}
@MyAnnotation(theEnum = MYENUM_CONSTANT, theInt = INT_CONSTANT, theString = STRING_CONSTANT)
public void methodB() {
}
}
エラーは、methodBの「theEnum=MYENUM_CONSTANT」にのみ表示されます。Stringおよびint定数はコンパイラーで問題ありませんが、Enum定数は、methodAの値とまったく同じ値であっても問題ありません。3つすべてが明らかに定数であるため、これはコンパイラーに欠けている機能であるように私には見えます。メソッド呼び出しやクラスの奇妙な使用などはありません。
私が達成したいのは:
- 注釈とコードの後半の両方でMYENUM_CONSTANTを使用します。
- タイプを安全に保つため。
これらの目標を達成するための任意の方法で問題ありません。
編集:
皆さんありがとう。あなたが言うように、それはできません。JLSを更新する必要があります。今回はアノテーションの列挙型を忘れて、通常のint定数を使用することにしました。intが名前付き定数から割り当てられている限り、値は制限され、「一種の」タイプセーフです。
次のようになります。
public interface MyEnumSimulation {
public static final int APPLE = 0;
public static final int ORANGE = 1;
}
...
public static final int MYENUMSIMUL_CONSTANT = MyEnumSimulation.APPLE;
...
@MyAnnotation(theEnumSimulation = MYENUMSIMUL_CONSTANT, theInt = INT_CONSTANT, theString = STRING_CONSTANT)
public void methodB() {
...
そして、コード内の他の場所でMYENUMSIMUL_CONSTANTを使用できます。