Использование String.join в постоянном выражении

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

String str = String.join(", ", "abc", "def", "ghi", "jkl");

@Annotation(str)
public void foo();

Но я получаю ошибку element value must be a constant expression. Я понимаю, что выражение не вписывается в определение константного выражения в Java, однако есть ли способ утверждать компилятору, что str является константой? Код намного легче читать и поддерживать, если я могу написать его вышеописанным способом (фактический список намного длиннее в моем реальном коде).


person Samuel Barr    schedule 18.06.2019    source источник


Ответы (1)


No.

Постоянное выражение имеет точное определение в спецификации языка, и все, что связано с вызовом метода, не является константным выражением.

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

person Andy Turner    schedule 18.06.2019
comment
Штопать. Было бы удобно, если бы компилятор мог обрабатывать определенные выражения в особом случае, но вполне может быть причина, по которой это невозможно. - person Samuel Barr; 19.06.2019
comment
@SamuelBarr в этом направлении ведутся исследования, см. openjdk.java.net/jeps/303# Распространение констант и cr.openjdk.java.net/~briangoetz/amber/ - person Holger; 11.07.2019