13

これはコードベース全体に散らばっています:

@RequestMapping(value = "myValue")

私はこのようなものを使用したいと思います:

@RequestMapping(value = Constants.myValue)

@RequestMapping定数の代わりに実際の文字列値を使用して DRY を破るようです。しかし、これは良いコード プラクティスでしょうか? 代わりに列挙型を使用する必要がありますか? Constants.myValueコードベースの他の場所で使用する必要があるかもしれません。

4

1 に答える 1

23

代わりに列挙型を使用する必要がありますか?

できません。注釈変数は、コンパイル時の定数でなければなりません。列挙型と文字列リテラルはどちらも同じですが、文字列であり、文字列を必要とする列挙型を作成することはできません@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 フィールドですが、コンパイル時の定数ではないため、注釈パラメーターとして使用することはできません

于 2012-07-31T13:39:50.720 に答える