2016-09-27 2 views
0

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

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

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

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

Кроме того, константа без «окончательного» модификатора не является постоянной, не так ли?

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

+0

Вы обнаружили отверстие в своих знаниях о java. И для записи: да, это как-то проблема в более крупных настройках **, но ** это хорошо известная проблема. Любая разумная ** система сборки ** должна иметь возможность справиться с этим; путем ** понимания ** зависимостей и необходимости перекомпилировать все классы, которые необходимо ... – GhostCat

+0

Мы сделали ту же ошибку не так давно. Мы изменили интерфейс, чтобы иметь getter-Methods. и класс внедрения. Пожалуйста, посмотрите, добавьте «Эффективная Java» от Джошуа Блоха. Пункт 19: «Использовать интерфейсы только для определения типов» –

ответ

1

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

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