Ada banyak kegunaan untuk variabel final
. Berikut ini beberapa di antaranya
Konstanta Terakhir
public static class CircleToolsBetter {
public final static double PI = 3.141;
public double getCircleArea(final double radius) {
return (Math.pow(radius, 2) * PI);
}
}
Ini dapat digunakan kemudian untuk bagian lain dari kode Anda, atau diakses oleh kelas lain, dengan cara itu jika Anda akan mengubah nilai Anda tidak perlu mengubahnya satu per satu.
Variabel akhir
public static String someMethod(final String environmentKey) {
final String key = "env." + environmentKey;
System.out.println("Key is: " + key);
return (System.getProperty(key));
}
}
Di kelas ini, Anda membangun variabel akhir yang mencakup yang menambahkan awalan ke parameter environmentKey. Dalam hal ini, variabel final hanya final dalam lingkup eksekusi, yang berbeda pada setiap eksekusi metode. Setiap kali metode dimasukkan, final direkonstruksi. Segera setelah dibangun, itu tidak dapat diubah selama lingkup eksekusi metode. Ini memungkinkan Anda untuk memperbaiki variabel dalam metode selama durasi metode. Lihat di bawah:
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");
}
}
Konstanta Terakhir
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
}
Ini sangat berguna ketika Anda memiliki baris kode yang sangat panjang, dan itu akan menghasilkan kesalahan kompiler sehingga Anda tidak menjalankan kesalahan logika / bisnis ketika seseorang secara tidak sengaja mengubah variabel yang tidak boleh diubah.
Koleksi Terakhir
Berbeda halnya ketika kita berbicara tentang Koleksi, Anda perlu menetapkannya sebagai yang tidak dapat dimodifikasi.
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);
}
jika tidak, jika Anda tidak menetapkannya sebagai tidak dapat dimodifikasi:
Set colors = Rainbow.VALID_COLORS;
colors.add(Color.black); // <= logic error but allowed by compiler
Kelas Final dan Metode Final tidak dapat diperpanjang atau ditimpa masing-masing.
SUNTING: UNTUK MENCOBA MASALAH KELAS FINAL TENTANG PENERAPAN:
Ada dua cara untuk membuat kelas menjadi final. Yang pertama adalah menggunakan kata kunci akhir dalam deklarasi kelas:
public final class SomeClass {
// . . . Class contents
}
Cara kedua untuk membuat final kelas adalah mendeklarasikan semua konstruktornya sebagai pribadi:
public class SomeClass {
public final static SOME_INSTANCE = new SomeClass(5);
private SomeClass(final int value) {
}
Menandai itu final akan menyelamatkan Anda dari masalah jika mengetahui bahwa itu adalah final, untuk menunjukkan tampilan pada kelas Tes ini. terlihat publik pada pandangan pertama.
public class Test{
private Test(Class beanClass, Class stopClass, int flags)
throws Exception{
// . . . snip . . .
}
}
Sayangnya, karena satu-satunya konstruktor kelas adalah privat, tidak mungkin untuk memperpanjang kelas ini. Dalam hal kelas Tes, tidak ada alasan bahwa kelas tersebut harus final. Kelas Tes adalah contoh yang baik tentang bagaimana kelas akhir implisit dapat menyebabkan masalah.
Jadi Anda harus menandainya sebagai final ketika Anda secara implisit membuat final kelas dengan menjadikannya konstruktor pribadi.