Комментарий слишком маленький, так что вот вам дополнительная информация по использованию static final
. Как я уже сказал в своем комментарии к Andrzej's answer, только примитив и 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);
}
}
компилировать их и запустить тест, который печатает:
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");
}
Run Test без перекомпиляции 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...
}
Код в «... code here ...» не будет скомпилирован в байтовый код. Но если вы изменили DEBUG
на true
, тогда это будет так.
В современном C++ вы должны использовать типизированную константу, а не #define для этого –
Да, #define - это C-стиль. В C++ вместо этого используйте const. См. Книгу Скотта Мейерса «Эффективный С ++», пункт 1. – Jabba