Es gibt viele Verwendungszwecke für die Variable final
. Hier sind nur einige
Endkonstanten
public static class CircleToolsBetter {
public final static double PI = 3.141;
public double getCircleArea(final double radius) {
return (Math.pow(radius, 2) * PI);
}
}
Dies kann dann für andere Teile Ihres Codes verwendet werden oder von anderen Klassen aufgerufen werden. Wenn Sie den Wert jemals ändern würden, müssten Sie sie nicht einzeln ändern.
Letzte Variablen
public static String someMethod(final String environmentKey) {
final String key = "env." + environmentKey;
System.out.println("Key is: " + key);
return (System.getProperty(key));
}
}
In dieser Klasse erstellen Sie eine endgültige Variable mit Gültigkeitsbereich, die dem Parameter environmentKey ein Präfix hinzufügt. In diesem Fall ist die endgültige Variable nur innerhalb des Ausführungsbereichs endgültig, der bei jeder Ausführung der Methode unterschiedlich ist. Bei jeder Eingabe der Methode wird das Finale rekonstruiert. Sobald es erstellt wurde, kann es im Rahmen der Methodenausführung nicht mehr geändert werden. Auf diese Weise können Sie eine Variable in einer Methode für die Dauer der Methode festlegen. siehe unten:
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");
}
}
Endkonstanten
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
}
Diese sind besonders nützlich, wenn Sie wirklich lange Codezeilen haben und sie einen Compilerfehler erzeugen, sodass Sie nicht auf Logik- / Geschäftsfehler stoßen, wenn jemand versehentlich Variablen ändert, die nicht geändert werden sollten.
Endgültige Sammlungen
In einem anderen Fall, wenn es sich um Sammlungen handelt, müssen Sie sie als nicht modifizierbar festlegen.
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);
}
Andernfalls, wenn Sie es nicht als nicht änderbar festlegen:
Set colors = Rainbow.VALID_COLORS;
colors.add(Color.black); // <= logic error but allowed by compiler
Final Classes und Final Methods können nicht erweitert bzw. überschrieben werden.
BEARBEITEN: UM DAS ENDGÜLTIGE KLASSENPROBLEM IN BEZUG AUF DIE ENKAPSULATION ZU BEHEBEN:
Es gibt zwei Möglichkeiten, ein Klassenfinale zu erreichen. Das erste besteht darin, das Schlüsselwort final in der Klassendeklaration zu verwenden:
public final class SomeClass {
// . . . Class contents
}
Die zweite Möglichkeit, ein Klassenfinale zu erreichen, besteht darin, alle Konstruktoren als privat zu deklarieren:
public class SomeClass {
public final static SOME_INSTANCE = new SomeClass(5);
private SomeClass(final int value) {
}
Wenn Sie es als endgültig markieren, sparen Sie sich die Mühe, wenn Sie feststellen, dass es sich tatsächlich um ein Finale handelt, um einen Blick auf diese Testklasse zu werfen. sieht auf den ersten Blick öffentlich aus.
public class Test{
private Test(Class beanClass, Class stopClass, int flags)
throws Exception{
// . . . snip . . .
}
}
Da der einzige Konstruktor der Klasse privat ist, ist es leider unmöglich, diese Klasse zu erweitern. Im Fall der Testklasse gibt es keinen Grund, warum die Klasse endgültig sein sollte. Die Testklasse ist ein gutes Beispiel dafür, wie implizite Abschlussklassen Probleme verursachen können.
Sie sollten es also als endgültig markieren, wenn Sie eine Klasse implizit endgültig machen, indem Sie ihren Konstruktor privat machen.