Zmienna ma wiele zastosowań final
. Oto tylko kilka
Ostateczne stałe
public static class CircleToolsBetter {
public final static double PI = 3.141;
public double getCircleArea(final double radius) {
return (Math.pow(radius, 2) * PI);
}
}
Można to następnie wykorzystać do innych części kodów lub uzyskać do nich dostęp inne klasy, w ten sposób, gdybyś kiedykolwiek zmienił wartość, nie musiałbyś zmieniać ich jeden po drugim.
Zmienne końcowe
public static String someMethod(final String environmentKey) {
final String key = "env." + environmentKey;
System.out.println("Key is: " + key);
return (System.getProperty(key));
}
}
W tej klasie tworzysz zmienną końcową o określonym zakresie, która dodaje prefiks do parametru environmentKey. W tym przypadku zmienna końcowa jest ostateczna tylko w zakresie wykonania, który jest inny przy każdym wykonaniu metody. Za każdym razem, gdy wprowadzana jest metoda, finał jest odtwarzany. Tak szybko, jak jest skonstruowana, nie można jej zmienić w zakresie wykonywania metody. Pozwala to naprawić zmienną w metodzie na czas jej trwania. patrz poniżej:
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");
}
}
Ostateczne stałe
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
}
Są one szczególnie przydatne, gdy masz naprawdę długie wiersze kodów i generują błąd kompilatora, więc nie napotkasz błędu logicznego / biznesowego, gdy ktoś przypadkowo zmieni zmienne, których nie należy zmieniać.
Ostateczne kolekcje
Inny przypadek, gdy mówimy o kolekcjach, musisz ustawić je jako niemodyfikowalne.
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);
}
w przeciwnym razie, jeśli nie ustawisz go jako niemodyfikowalnego:
Set colors = Rainbow.VALID_COLORS;
colors.add(Color.black); // <= logic error but allowed by compiler
Klasy końcowe i metody końcowe nie mogą być odpowiednio przedłużane ani nadpisywane.
EDYCJA: ABY ROZWIĄZAĆ KOŃCOWY PROBLEM KLASOWY DOTYCZĄCY ENCAPSULACJI:
Istnieją dwa sposoby, aby zakończyć klasę. Pierwszym jest użycie słowa kluczowego final w deklaracji klasy:
public final class SomeClass {
// . . . Class contents
}
Drugim sposobem nadania klasy ostatecznej jest zadeklarowanie wszystkich jej konstruktorów jako prywatnych:
public class SomeClass {
public final static SOME_INSTANCE = new SomeClass(5);
private SomeClass(final int value) {
}
Oznaczanie go jako ostatecznego oszczędza kłopotów, jeśli dowiesz się, że jest to ostateczny, aby zademonstrować spojrzenie na tę klasę testu. wygląda publicznie na pierwszy rzut oka.
public class Test{
private Test(Class beanClass, Class stopClass, int flags)
throws Exception{
// . . . snip . . .
}
}
Niestety, ponieważ jedyny konstruktor tej klasy jest prywatny, nie jest możliwe rozszerzenie tej klasy. W przypadku klasy Test nie ma powodu, aby zajęcia były ostateczne. Klasa Test jest dobrym przykładem tego, jak niejawne klasy końcowe mogą powodować problemy.
Dlatego powinieneś oznaczyć ją jako ostateczną, gdy niejawnie ustawiasz klasę jako ostateczną, ustawiając jej konstruktor jako prywatny.