2013-05-12 61 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 { 
    // ... 
} 
相关问题