Місце для коментарів замале, тому ось вам трохи більше інформації про використання 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то це було б.