Final Özelliğinin Kullanımı
Final kelimesinin sözlük anlamı "son" demektir. Java programlama dilindeki final özeliği de, sözlük anlamıyla paralel bir anlam taşır. Java programlama dilinde final anahtar kelimesi değiştirilemezliği simgeler. Değiştirilemezliğin seçilmesi iki sebepten dolayı olabilir, birincisi tasarım ikincisi ise verimlilik;
Global olan alanlara, yordamlara ve sınıflara final özelliğini uygulayabiliriz.
Verilen örnekte X_SABIT_DEGER ve Y_SABIT_DEGER alanlarının değerlerini derleme anında bilenebilmesi mümkündür ama A_SABIT_DEGER alanının değerini derleme anında bilmek zordur (Math sınıfına ait statik bir yordam olan random(), 1 ile 50 arasında rasgele sayılar üretir), bu alanın değeri çalışma anında belli olacaktır. Bir global alana, final ve statik özellikler belirtirseniz, bu global alanımız, bu sınıfa ait olan tüm nesneler için tek olur (bkz: 3. bölüm, statik alanlar) ve değeri sonradan değiştirilemez.
Final özelliğinin etkisi, ilkel tipteki alanlar ve sınıf tipindeki alanlar farklıdır. Yukarıdaki örneğimizi incelerseniz, X_SABIT_DEGER, Y_SABIT_DEGER, A_SABIT_DEGER alanları hep ilkel tipteydi; yani değerlerini kendi üzerlerinde taşıyorlardı. Kutu tipinde k alanımızı final yaptığımızda olaylar biraz
değişir, Kutu sınıfı tipindeki k alanını final yaparak, bu alanın başka bir Kutu nesnesine tekrardan bağlanmasına izin vermeyiz ama Kutu sınıfı tipindeki k alanının bağlı olduğu nesnenin içeriği değişebilir.
Uygulamanın sonucu aşağıdaki gibi olur:
X_SABIT_DEGER = 34
Y_SABIT_DEGER = 35
A_SABIT_DEGER = 39
Kutu.i = 35
Argümanın final olması
Bu uygulamamız, dışarıdan iki parametre alarak bunları ilkel olan int tipine çeviriyor. Eğer dışarıdan eksik veya fazla parametre girilmiş ise kullanıcı bu konuda uyarılıyor. Daha sonra elimizdeki değerleri FinalParametre sınıfının statik olan topla() yordamına gönderiyoruz. Bu yordama gönderilen
parametrelerin değiştirilmesi, final ifadeden dolayı imkansızdır.
Kısacası final yordamlar iptal edilemezler
A sınıfına ait ekranaYaz() yordamı, A sınıfından türetilmiş B sınıfının ekranaYaz() yordamı tarafından iptal edilemez (overriding). FinalMetod.java örneğini derlemeye çalıştığımızda aşağıdaki hata mesajını alırız:
Final Sınıflar
Bir sınıfı final yaparak, bu sınıftan türetilme yapılmasını engellemiş oluruz. Bir sınıfın final yapılmasının iki sebebi olabilir, birincisi tasarım, ikincisi ise verimlilik. final sınıflar komposizyon yöntemi ile kullanabilirler.
Global olan alanlara, yordamlara ve sınıflara final özelliğini uygulayabiliriz.
class Kutu {
int i = 0;
}
public class FinalOrnek {
final int X_SABIT_DEGER = 34;
final static int Y_SABIT_DEGER = 35;
final int A_SABIT_DEGER = (int) (Math.random() * 50);
final Kutu k = new Kutu();
public static void main(String args[]) {
FinalOrnek fo = new FinalOrnek();
// fo.X_SABIT_DEGER = 15 ! Hata !
// fo.Y_SABIT_DEGER = 16 ! Hata !
// fo.A_SABIT_DEGER = 17 ! Hata !
fo.k.i = 35; // doğru
// fo.k = new Kutu() ! hata !
System.out.println("X_SABIT_DEGER = " + fo.X_SABIT_DEGER);
System.out.println("Y_SABIT_DEGER = " + fo.Y_SABIT_DEGER);
System.out.println("A_SABIT_DEGER = " + fo.A_SABIT_DEGER);
System.out.println("Kutu.i = " + fo.k.i);
}
}
Verilen örnekte X_SABIT_DEGER ve Y_SABIT_DEGER alanlarının değerlerini derleme anında bilenebilmesi mümkündür ama A_SABIT_DEGER alanının değerini derleme anında bilmek zordur (Math sınıfına ait statik bir yordam olan random(), 1 ile 50 arasında rasgele sayılar üretir), bu alanın değeri çalışma anında belli olacaktır. Bir global alana, final ve statik özellikler belirtirseniz, bu global alanımız, bu sınıfa ait olan tüm nesneler için tek olur (bkz: 3. bölüm, statik alanlar) ve değeri sonradan değiştirilemez.
Final özelliğinin etkisi, ilkel tipteki alanlar ve sınıf tipindeki alanlar farklıdır. Yukarıdaki örneğimizi incelerseniz, X_SABIT_DEGER, Y_SABIT_DEGER, A_SABIT_DEGER alanları hep ilkel tipteydi; yani değerlerini kendi üzerlerinde taşıyorlardı. Kutu tipinde k alanımızı final yaptığımızda olaylar biraz
değişir, Kutu sınıfı tipindeki k alanını final yaparak, bu alanın başka bir Kutu nesnesine tekrardan bağlanmasına izin vermeyiz ama Kutu sınıfı tipindeki k alanının bağlı olduğu nesnenin içeriği değişebilir.
Uygulamanın sonucu aşağıdaki gibi olur:
X_SABIT_DEGER = 34
Y_SABIT_DEGER = 35
A_SABIT_DEGER = 39
Kutu.i = 35
Argümanın final olması
public class FinalParametre {
public static int topla(final int a, final int b) {
// a = 5 ! Hata !
// b = 9 ! Hata !
return a + b;
}
public static void main(String args[]) {
if ((args.length != 2)) {
System.out.println("Eksik veri Girildi");
System.exit(-1); // Uygulamayi sonlandir
}
int a = Integer.parseInt(args[0]);
int b = Integer.parseInt(args[1]);
int sonuc = FinalParametre.topla(a, b);
System.out.println("Sonuc = " + sonuc);
}
}
Bu uygulamamız, dışarıdan iki parametre alarak bunları ilkel olan int tipine çeviriyor. Eğer dışarıdan eksik veya fazla parametre girilmiş ise kullanıcı bu konuda uyarılıyor. Daha sonra elimizdeki değerleri FinalParametre sınıfının statik olan topla() yordamına gönderiyoruz. Bu yordama gönderilen
parametrelerin değiştirilmesi, final ifadeden dolayı imkansızdır.
Kısacası final yordamlar iptal edilemezler
class A {
public final void ekranaYaz() {
System.out.println("A.ekranaYaz()");
}
}
class B extends A {
public void ekranaYaz() {
System.out.println("B.ekranaYaz()");
}
A sınıfına ait ekranaYaz() yordamı, A sınıfından türetilmiş B sınıfının ekranaYaz() yordamı tarafından iptal edilemez (overriding). FinalMetod.java örneğini derlemeye çalıştığımızda aşağıdaki hata mesajını alırız:
Final Sınıflar
Bir sınıfı final yaparak, bu sınıftan türetilme yapılmasını engellemiş oluruz. Bir sınıfın final yapılmasının iki sebebi olabilir, birincisi tasarım, ikincisi ise verimlilik. final sınıflar komposizyon yöntemi ile kullanabilirler.
final class Televizyon {
public void kanalBul() {
}
}
/*
class SuperTelevizyon extends Televizyon{ // Hatali
}
*/
class Ev {
int oda_sayisi = 5;
Televizyon tv = new Televizyon();
public static void main(String args[]) {
Ev e = new Ev();
e.tv.kanalBul();
}
}
Yorumunuzu Ekleyin