代わりに列挙型を使用する必要がありますか?
できません。注釈変数は、コンパイル時の定数でなければなりません。列挙型と文字列リテラルはどちらも同じですが、文字列であり、文字列を必要とする列挙型を作成することはできません@RequestMapping
(また、列挙型に文字列または文字列フィールドを返すメソッドがある場合、それはコンパイル時の定数ではありません)。注釈処理には複数のラウンドがあるため、定数が別のクラスにある場合は機能します。
そうは言っても、専用の定数クラス(おそらく、さまざまなタイプの定数用にいくつか)を使用することは、できる限り使用する良い習慣です(定数aが定義されていない限り、注釈で機能します)注釈を持つ同じコンパイル単位内で、b) 宣言で初期化されます (静的初期化ブロックとは対照的に))。
次に例を示します。
コントローラ
@Controller @RequestMapping(value = Mappings.CUSTOMER_PAGE)
public class CustomerPageController{
// methods here
}
定数クラス
public static final class Mappings{
private Mappings(){}
public static final String CUSTOMER_PAGE = "path/to/customer/page"
// more constants
}
そして、動作しないバージョンがいくつかあります:
a)
@Controller @RequestMapping(value = CUSTOMER_PAGE)
public class CustomerPageController{
private static final String CUSTOMER_PAGE = "path/to/customer/page";
}
注釈は注釈を付けるクラス内の定数を参照するため、これはコンパイルされません。コンパイル中、注釈は残りのコードの前に別のラウンドで処理されるため、これは機能しませんが、クラスはコンパイルのために注釈が既に処理されている必要があります (つまり、注釈と定数の間に循環依存関係があります)。
b)
public static final class Mappings{
private Mappings(){}
public static final String CUSTOMER_PAGE;
static{
CUSTOMER_PAGE = "path/to/customer/page"
}
// more constants
}
これは static final フィールドですが、コンパイル時の定数ではないため、注釈パラメーターとして使用することはできません