Подтвердить что ты не робот

Избавьтесь от сообщения "Значение атрибута annotation должно быть константным выражением"

Я использую аннотацию в своем коде, и я пытаюсь использовать значение, которое определяется во время выполнения.

Я определяю свой список как static final (lst), и я добавляю к этому списку некоторые элементы.

Когда я использую lst.get(i), я получаю ошибку компиляции:

The value for annotation attribute must be a constant expression

Каково решение этой проблемы?

4b9b3361

Ответ 1

Значение для аннотации должно быть постоянной времени компиляции, поэтому не существует простого способа сделать то, что вы пытаетесь сделать.

См. также здесь: Как указать значение для аннотации из константы Java

Можно использовать некоторые инструменты времени компиляции (ant, maven?), Чтобы сконфигурировать его, если значение известно до того, как вы попытаетесь запустить программу.

Ответ 2

это бессмысленное ограничение; просто потому, что он был реализован таким образом, это не значит, что это правильный путь. возможно, они, возможно, захотели пойти поэтапно и сначала реализовали ограничения проверки времени компиляции, но это не значит, что мы должны останавливаться на достигнутом и обходить его гибкость.

Я думаю, что пришло время поднять шум о необходимости проверки ограничений времени выполнения, даже если это вызвало небольшой удар производительности. те ограничения, которые имеют значения времени компиляции, должны быть проверены с использованием реализаторов проверки времени компиляции, а те, у которых есть значения времени выполнения, должны быть проверены с использованием реализаторов проверки выполнения.

Нам следует лучше поднять запрос на повышение с экспертной комиссией JSR 303 для добавления этой функции или, возможно, это ограничение самой функции Annotation, поэтому запрос должен быть отправлен в группу экспертов JSR-250, если она все еще в силе.

Ответ 3

Вот как выглядит постоянное выражение в 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 {
  // ...
}