ChatGPT解决这个技术问题 Extra ChatGPT

摆脱“注释属性的值必须是常量表达式”消息[重复]

这个问题在这里已经有了答案:How to provide value to an annotation from an Constant java (6 answers) 3年前关闭。

我在代码中使用注释,并尝试使用在运行时确定的值。

我将我的列表定义为 static final (lst),并在此列表中添加了一些元素。

当我使用 lst.get(i) 时,我得到编译错误:

The value for annotation attribute must be a constant expression

这个问题的解决方案是什么?

使用常量表达式。
这是胡说八道的限制;仅仅因为它以这种方式实施并不意味着它是正确的方式。也许他们可能想要分阶段进行并首先实现编译时验证约束,但这并不意味着我们必须停在那里并抱怨它的不灵活性。我认为是时候提出关于约束的运行时验证需求的噪音了,即使它会导致小的性能损失。那些具有编译时值的约束必须使用编译时验证器实现来验证,而那些具有运行时值的约束必须使用运行时有效来验证
您可以用不同的方式安排事情:stackoverflow.com/questions/7814089/…
否决代码和重复
我不明白为什么这个问题被标记为重复。它们是相关的,但不重复。这个问题更具体。如果不是这个标题,我不会认为另一个问题的答案是有帮助的。

m
mbmc

注释的值必须是编译时间常数,因此没有简单的方法可以做您想做的事情。

参见此处:How to supply value to an annotation from a Constant java

如果在尝试运行程序之前知道该值,则可以使用一些编译时工具(ant,maven?)来配置它。


> 如果在尝试运行程序之前该值已知,则可以使用一些编译时工具(ant、maven?)对其进行配置。如何?
B
Benny Neugebauer

这就是 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 {
  // ...
}

GUESTBOOK_URL = "book" + MyEnum.Field 怎么样,这可能吗?
在问题的上下文中,“常量”的含义是编译时间常量。 final 通常不是编译时间常数。这不适用于列表。该代码具有误导性,因为它只起作用,因为类中的字符串是编译时常量。