Вот почему может быть полезно пометить почти все как 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) {
}
Пометка его как final избавит вас от проблем, если вы узнаете, что это действительно финал, чтобы продемонстрировать взгляд на этот класс Test. на первый взгляд выглядит публично.
public class Test{
private Test(Class beanClass, Class stopClass, int flags)
throws Exception{
// . . . snip . . .
}
}
К сожалению, поскольку единственный конструктор класса является частным, расширить этот класс невозможно. В случае класса Test нет причин, по которым класс должен быть окончательным. Тестовый класс - хороший пример того, как неявные конечные классы могут вызывать проблемы.
Таким образом, вы должны пометить его как final, когда вы неявно делаете класс final, делая его конструктор закрытым.
person
mel3kings
schedule
21.06.2013