1. ホーム
  2. java

[解決済み] 定数からアノテーションに値を供給する方法 java

2022-04-23 03:21:35

質問

アノテーションとそのパラメータはコンパイル時に解決されるため、Javaではこのようなことはできないのではないかと考えています。以下のようなインターフェースを持っています。

public interface FieldValues {
   String[] FIELD1 = new String[]{"value1", "value2"};
}

という別のクラスがあります。

@SomeAnnotation(locations = {"value1", "value2"})
public class MyClass {
   ....
}

私は多くのクラスをアノテーションでマークしていますが、すべてのアノテーションで文字列を指定することを避けられるかどうかを知りたいのです。

@SomeAnnotation(locations = FieldValues.FIELD1)
public class MyClass {
   ....
}

しかし、これはアノテーションの値が配列のイニシャライザであるべきであるなどのコンパイルエラーを出します。String定数やString[]定数を使用してアノテーションに値を与える方法をご存知の方はいらっしゃいますか?

どのように解決するのですか?

コンパイル定数 はプリミティブと文字列のみです。 :

15.28. 定数式

コンパイル時の 定数式 は、プリミティブ型の値や文字列を表す式で、突然完結せず、次のものだけを用いて構成されるものです。

  • プリミティブ型のリテラルと String
  • プリミティブ型へのキャストと型へのキャスト String
  • 演算子 [...]演算子 [...]演算子
  • 定数表現を含む括弧付き表現。
  • 定数変数を参照する単純な名前。
  • 形式の修飾名 タイプ名 . 識別子 定数変数を参照するものである。

実はjavaでは配列の中の項目を保護する方法はありません。実行時に誰かが常に FieldValues.FIELD1[0]="value3" したがって、配列は深く見れば本当に一定であるはずがないのです。