Существует много вариантов использования переменной 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
}
Второй способ сделать класс final - объявить все его конструкторы как частные:
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 нет причин, по которым этот класс должен быть окончательным. Класс Test является хорошим примером того, как неявные конечные классы могут вызывать проблемы.
Поэтому вы должны пометить его как финальный, когда вы неявно делаете класс финальным, делая его конструктор закрытым.