Как избежать замены постоянной ссылки литералом при компиляции

Я обнаружил, что когда константа (static final, инициализируемая во время компиляции) объявляется в одном проекте, ссылки на нее в другом проекте заменяются литералом при компиляции.

Кажется, единственный способ избежать этого и иметь ссылки, относящиеся к полю константы, а не к литералу, - это объявить константу в классе (в отличие от интерфейса) и опустить "final", например:

public class MyClass {
   public static String MY_CONSTANT = "The constant value";
 }

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

Кроме того, константа без модификатора final не совсем константа, не так ли?

Есть ли параметр компиляции, который может подавить замену постоянных ссылок литералами?


person Elly    schedule 27.09.2016    source источник
comment
Вы обнаружили дыру в своих знаниях о java. И для записи: да, это какая-то проблема в более крупных установках, но это хорошо известная проблема. Любая разумная система сборки должна уметь справляться с этим; понимая зависимости и необходимость перекомпилировать все классы, которые необходимо ...   -  person GhostCat    schedule 27.09.2016
comment
Не так давно мы совершили ту же ошибку. Затем мы изменили интерфейс на методы получения. и класс реализации. Пожалуйста, посмотрите, добавьте Effective Java от Джошуа Блоха. Правило 19: Используйте интерфейсы только для определения типов   -  person Tobias Otto    schedule 27.09.2016


Ответы (1)


Вам просто нужно что-то, что не является выражение константы времени компиляции. Например, вызовов методов нет. Так что простое добавление .intern() в конце каждого литерала заставит его выйти из правил. Затем каждый ссылающийся сайт должен будет обеспечить инициализацию целевого типа и прочитать текущее значение.

Параметр компилятора, изменяющий это поведение, невозможен, поскольку он нарушает Спецификацию языка Java.

person Marko Topolnik    schedule 27.09.2016