Місце для коментарів замале, тому ось вам трохи більше інформації про використання 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);
}
}
Скомпілюйте їх і запустіть тест, який надрукує:
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
допомогою примітивів, що використовується в звичайній if
умові Java та обчислюється, false
призведе до того, що компілятор вилучить байтовий код для операторів у if
блоці (вони не генеруються).
private static final boolean DEBUG = false;
if (DEBUG) {
...code here...
}
Код на "... код тут ..." не буде компілюватися в байт-код. Але якби ви змінили DEBUG
на, true
то це було б.