2013-05-12 332 views
40

私は自分のコードで注釈を使用しており、実行時に決定する値を使用しようとしています。"annotation属性の値は定数式でなければならない"というメッセージを取り除く

私はリストをstatic final(lst)と定義し、このリストにいくつかの要素を追加します。

私はlst.get(i)を使用し、私はコンパイルエラーを取得:

The value for annotation attribute must be a constant expression 

は、この問題の解決策は何ですか?

+1

は、定数式を使用してください。 –

+0

さまざまな方法でスケジュールを設定できます。 http://stackoverflow.com/questions/7814089/how-to-schedule-a-periodic-task-in-java – obesechicken13

答えて

29

アノテーションの値はコンパイル時定数でなければならないため、実行しようとしていることを行う簡単な方法はありません。

はこちらを参照:How to supply value to an annotation from a Constant java

(アリ、Mavenの?)いくつかのコンパイル時ツールを使用することが可能である値は、あなたがプログラムを実行しようとする前に知っている場合は、それを設定へ。

28

これはナンセンス制限です。そのように実装されているからといって、正しい方法であるとは限りません。おそらく彼らは段階的に進めたいと思っているかもしれませんし、最初にコンパイル時の検証制約を実装していたかもしれませんが、それはその不屈の点についてそこで停止しなければならないというわけではありません。

私は、小さなパフォーマンスヒットが発生したとしても、制約の実行時検証の必要性について騒ぎを起こす時だと思います。コンパイル時の値を持つ制約は、コンパイル時のバリデータの実装を使用して検証する必要があり、実行時の値を持つものは、実行時の検証器の実装を使用して検証する必要があります。

この機能追加のためにJSR 303熟練委員会で強化要求を行うことをお勧めします。これは注釈機能自体の制限である可能性があるため、JSR-250エキスパートグループに依頼する必要があります。

8

これは、Javaの定数式は、次のようになります。

package com.mycompany.mypackage; 

public class MyLinks { 
    // constant expression 
    public static final String GUESTBOOK_URL = "/guestbook"; 
} 

あなたは、次のよう注釈でそれを使用することができます。

import com.mycompany.mypackage.MyLinks; 

@WebServlet(urlPatterns = {MyLinks.GUESTBOOK_URL}) 
public class GuestbookServlet extends HttpServlet { 
    // ... 
} 
関連する問題