Вам придется перекомпилировать все классы, которые ссылаются на эти String
константы.
Обратите внимание, что поле static final
типа примитива или типа String
, которое инициализируется значением постоянной времени компиляции (так называемая постоянная переменная ) будет встроенный, когда они используются в других классах.
Другими словами, если у вас есть эти классы:
public class Constants {
public static final int FOO = 42;
}
public class Bar {
public void frobnicate() {
System.out.println(Constants.FOO);
}
}
Затем во время компиляции значение FOO
будет скомпилировано в файл .class
Bar
, что означает, что Bar
больше не ссылается на Constants
во время выполнения!
Это также означает, что любое изменение FOO
не будет влиять на Bar
до тех пор, пока вы не перекомпилируете Bar
с новым Constants.class
.
Этот эффект подробно обсуждается в JLS §13.4.9 final
Поля и константы .
Один из способов избежать этой проблемы в будущем - убедиться, что ваши "константы" не интерпретируются компилятором как константы. Один из способов сделать это - переместить присвоение значения из инициализатора в простое присвоение через статический блок инициализатора:
public class Constants {
public static final int FOO;
static {
FOO = 42;
}
}