Слишком мало места для комментариев, так что здесь есть дополнительная информация для использования static final
. Как я сказал в своем комментарии к ответу Анджей , только примитив и String
скомпилированы непосредственно в код как литералы. Чтобы продемонстрировать это, попробуйте следующее:
Вы можете увидеть это в действии, создав три класса (в отдельных файлах):
public class DisplayValue {
private String value;
public DisplayValue(String value) {
this.value = value;
}
public String toString() {
return value;
}
}
public class Constants {
public static final int INT_VALUE = 0;
public static final DisplayValue VALUE = new DisplayValue("A");
}
public class Test {
public static void main(String[] args) {
System.out.println("Int = " + Constants.INT_VALUE);
System.out.println("Value = " + Constants.VALUE);
}
}
Скомпилируйте их и запустите Test, который печатает:
Int = 0
Value = A
Теперь измените Constants
, чтобы иметь разные значения для каждого, и просто скомпилируйте класс Constants
. При повторном выполнении Test
(без перекомпиляции файла класса) он по-прежнему печатает старое значение для INT_VALUE
, но не VALUE
. Например:
public class Constants {
public static final int INT_VALUE = 2;
public static final DisplayValue VALUE = new DisplayValue("X");
}
Выполнить тест без перекомпиляции Test.java
:
Int = 0
Value = X
Обратите внимание, что любой другой тип, используемый с static final
, сохраняется в качестве ссылки.
Подобно C / C ++ #if
/ #endif
, константный литерал или константа, определенная через static final
с примитивами, используемая в обычном условии Java if
и оцениваемая в false
, заставит компилятор удалить байтовый код для операторов в блоке if
(они не будут сгенерированы).
private static final boolean DEBUG = false;
if (DEBUG) {
...code here...
}
Код в "... код здесь ..." не будет скомпилирован в байт-код. Но если бы вы изменили DEBUG
на true
, тогда это было бы.