Існує багато застосувань для змінної final
. Ось лише кілька
Кінцеві константи
public static class CircleToolsBetter {
public final static double PI = 3.141;
public double getCircleArea(final double radius) {
return (Math.pow(radius, 2) * PI);
}
}
Це може бути використане потім для інших частин ваших кодів або доступ до них у інших класах, якщо ви коли-небудь змінили значення, вам не доведеться змінювати їх по черзі.
Кінцеві змінні
public static String someMethod(final String environmentKey) {
final String key = "env." + environmentKey;
System.out.println("Key is: " + key);
return (System.getProperty(key));
}
}
У цьому класі ви будуєте масштабну остаточну змінну, яка додає префікс до параметра EnvironmentKey. У цьому випадку остаточна змінна є остаточною лише в межах виконання, що відрізняється при кожному виконанні методу. Кожен раз, коли метод вводиться, фінал реконструюється. Як тільки вона побудована, вона не може бути змінена під час виконання методу. Це дозволяє виправити змінну в методі протягом тривалості методу. Дивись нижче:
public class FinalVariables {
public final static void main(final String[] args) {
System.out.println("Note how the key variable is changed.");
someMethod("JAVA_HOME");
someMethod("ANT_HOME");
}
}
Кінцеві константи
public double equation2Better(final double inputValue) {
final double K = 1.414;
final double X = 45.0;
double result = (((Math.pow(inputValue, 3.0d) * K) + X) * M);
double powInputValue = 0;
if (result > 360) {
powInputValue = X * Math.sin(result);
} else {
inputValue = K * Math.sin(result); // <= Compiler error
}
Вони особливо корисні, коли у вас дійсно довгі рядки кодів, і це призведе до помилки компілятора, тому ви не наштовхуєтесь на логіку / помилку бізнесу, коли хтось випадково змінює змінні, які не слід змінювати.
Підсумкові колекції
Інший випадок, коли ми говоримо про колекції, вам потрібно визначити їх незмінними.
public final static Set VALID_COLORS;
static {
Set temp = new HashSet( );
temp.add(Color.red);
temp.add(Color.orange);
temp.add(Color.yellow);
temp.add(Color.green);
temp.add(Color.blue);
temp.add(Color.decode("#4B0082")); // indigo
temp.add(Color.decode("#8A2BE2")); // violet
VALID_COLORS = Collections.unmodifiableSet(temp);
}
в іншому випадку, якщо ви не встановите це як неможливий:
Set colors = Rainbow.VALID_COLORS;
colors.add(Color.black); // <= logic error but allowed by compiler
Заключні класи та Заключні методи не можна продовжувати або перезаписувати відповідно.
РЕДАКТУВАННЯ: АДРЕСАВАННЯ ПРОБЛЕМИ ЗВІТНЬОГО КЛАСУ, ЩО ВІДПОВІДАЄТЬСЯ НА РОЗКЛАДЖЕННІ:
Існує два способи зробити підсумковий клас. Перший - використовувати ключове слово final у декларації класу:
public final class SomeClass {
// . . . Class contents
}
Другий спосіб зробити остаточний клас - оголосити всіх його конструкторів приватними:
public class SomeClass {
public final static SOME_INSTANCE = new SomeClass(5);
private SomeClass(final int value) {
}
Позначення його остаточним позбавить вас від неприємностей, якщо дізнаєтесь, що це фактичний фінал, продемонструвавши перегляд цього тестового класу. на перший погляд виглядає публічно.
public class Test{
private Test(Class beanClass, Class stopClass, int flags)
throws Exception{
// . . . snip . . .
}
}
На жаль, оскільки єдиний конструктор класу є приватним, розширити цей клас неможливо. Що стосується класу Test, то немає причини, щоб клас був остаточним. Тест-клас є хорошим прикладом того, як неявні підсумкові класи можуть викликати проблеми.
Тож слід відзначити його остаточним, коли ти неявно робиш фінал класу, роблячи його конструктором приватним.