Место для комментариев слишком маленькое, поэтому вот еще немного информации об использовании 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...
}
Код в "...code here..." не будет скомпилирован в байтовый код. Но если бы вы изменили DEBUG
на true
, то так и было бы.
person
Kevin Brock
schedule
18.12.2009