2013-05-12 68 views
40

我在我的代碼中使用註釋,並嘗試使用在運行時確定的值。擺脫「註釋屬性的值必須是常量表達式」消息

我將我的列表定義爲static final(lst),並在此列表中添加了一些元素。

當我使用lst.get(i),我得到的編譯錯誤:

The value for annotation attribute must be a constant expression 

,這是什麼問題,該如何解決?

+1

使用常量表達式。 – 2013-05-12 15:46:44

+0

你可以用不同的方式安排事情: http://stackoverflow.com/questions/7814089/how-to-schedule-a-periodic-task-in-java – obesechicken13 2015-12-14 16:57:44

回答

29

註解的值必須是編譯時間常量,所以沒有簡單的方法來做你正在做的事情。

也見這裏:How to supply value to an annotation from a Constant java

有可能使用一些編譯時工具(Ant,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 { 
    // ... 
} 
相關問題