Кроме того, встраивание констант public
может быть источником проблем, на которые сложно ориентироваться, поскольку они не вызывают исключений или ошибок, но вызывают молчаливое неправильное поведение.
Допустим, у вас есть класс A с некоторыми public static final
полями примитивного типа или String
, значения которых можно определить во время компиляции.
public class A {
public static final String GREETING = "Hello";
...
}
Тогда, если другой класс B обращается к этому полю, компилятор подставляет константу, т. Е. Заменяет ссылку A.GREETING
ее значением "Hello"
. Информация о том, откуда взято постоянное значение, не сохраняется.
Теперь приходит проблема - если вы измените значение GREETING
на допустимое "Hi"
и перекомпилируете только класс A , встроенное значение в классе B останется без изменений, пока вы его не перекомпилируете. Поэтому обычно лучше перестроить все приложение с нуля , как уже отмечали другие.
Хорошая статья, обсуждающая эту проблему:
http://marxsoftware.blogspot.com/2009/09/inconstant-constants-in-java.html
Некоторые связанные вопросы SO:
Гарантируется ли Java встроенные строковые константы, если они могут быть определены во время компиляции
Все ли константы времени компиляции встроены?