Değişken için birçok kullanım alanı vardır final
. İşte sadece birkaçı
Nihai Sabitler
public static class CircleToolsBetter {
public final static double PI = 3.141;
public double getCircleArea(final double radius) {
return (Math.pow(radius, 2) * PI);
}
}
Bu, daha sonra kodlarınızın diğer bölümleri için kullanılabilir veya diğer sınıflar tarafından erişilebilir, böylece değeri tek tek değiştirmek zorunda kalmazsınız.
Nihai Değişkenler
public static String someMethod(final String environmentKey) {
final String key = "env." + environmentKey;
System.out.println("Key is: " + key);
return (System.getProperty(key));
}
}
Bu sınıfta, environmentKey parametresine önek ekleyen kapsamlı bir son değişken oluşturursunuz. Bu durumda, son değişken yalnızca yöntemin her yürütmesinde farklı olan yürütme kapsamı içinde kesindir. Yönteme her girildiğinde final yeniden yapılandırılır. Oluşturulur inşa edilmez, yöntem yürütme kapsamında değiştirilemez. Bu, yöntemdeki bir değişkeni yöntemde sabitlemenizi sağlar. aşağıya bakınız:
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");
}
}
Nihai Sabitler
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
}
Bunlar özellikle uzun kod satırlarınız olduğunda kullanışlıdır ve derleyici hatası oluşturur, böylece birisi yanlışlıkla değiştirilmemesi gereken değişkenleri değiştirdiğinde mantık / iş hatasına girmezsiniz.
Final Koleksiyonları
Koleksiyonlar hakkında konuşurken farklı bir durum, bunları değiştirilemez olarak ayarlamanız gerekir.
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);
}
aksi takdirde değiştirilemez olarak ayarlamazsanız:
Set colors = Rainbow.VALID_COLORS;
colors.add(Color.black); // <= logic error but allowed by compiler
Final Sınıfları ve Final Yöntemleri sırasıyla genişletilemez veya üzerine yazılamaz.
DÜZENLEME: KAPSAM İLE İLGİLİ NİHAİ SINIF SORUNUNUN ADRESİNDE:
Bir sınıfı final yapmak için iki yol vardır. Birincisi, sınıf bildiriminde final anahtar sözcüğünü kullanmaktır:
public final class SomeClass {
// . . . Class contents
}
Bir sınıf finali yapmanın ikinci yolu, tüm kurucularını özel olarak ilan etmektir:
public class SomeClass {
public final static SOME_INSTANCE = new SomeClass(5);
private SomeClass(final int value) {
}
Son olarak işaretlemek, bu Test sınıfına bir bakış göstermenin gerçek bir final olduğunu öğrenirseniz size sorun çıkarır. ilk bakışta herkese açık görünüyor.
public class Test{
private Test(Class beanClass, Class stopClass, int flags)
throws Exception{
// . . . snip . . .
}
}
Ne yazık ki, sınıfın tek kurucusu özel olduğundan, bu sınıfı genişletmek imkansızdır. Test sınıfı söz konusu olduğunda, sınıfın final olması için bir neden yoktur. Test sınıfı, örtük son sınıfların nasıl sorunlara neden olabileceğine iyi bir örnektir.
Bu yüzden, bir sınıfı yapıcıyı özel yaparak örtülü olarak final yaptığınızda bunu son olarak işaretlemelisiniz.