Java’da final anahtar kelimesi aşağıda yer alan yapılar için kullanılabilir:
- Final sınıf değişkenleri: Final olan bir sınıf değişkenine sadece bir kere değer ataması yapilabilir ve bu atama sadece sınıf konstrüktöründe gerçekleşebilir.
- Final metot parametreleri: Final olarak tanımlanmış bir metot parametresine sadece bir kere değer atanabilir. Metot parametrelerinin tamamen final olarak tanımlamış olmalarında büyük fayda vardır. Bu şekilde parametrenin metot bünyesinde değişikliğe ugrama tehlikesi ortadan kaldırılmış olur.
- Final metotlar: Final olan bir metot ne alt sınıflarca yeniden yüklenebilir (method overloading) ne de saklı (hidden) tutulabilir.
- Final sınıflar: Final olan bir sınıf genişletilerek bir alt sınıf oluşturulamaz.
Final anahtar kelimesi Java programcılığında en çok göz ardı edilenlerdendir. En son siz ne zaman final anahtar kelimesini kullandınız?
Final anahtar kelimesi programın daha doğru, hatalara dayanıklı ve performanslı çalışmasını sağlar.
Final anahtar kelimesinin kullanımında yapılan en büyük hatalardan birisi final static olarak tanımlanmış olan bir sınıf değişkenine değistirilebilir bir değerin atanmasıdır. Örneğin aşağıdaki tanımlama yanlıştır, çünkü static değişken final olmasına rağmen, bu değişkene atanan değer, kullanıcı tarafından değiştirilebilir.
public class App { public static final String[] LIST = {"1","2","3"}; public static void main(String[] args) { String[] list = App.LIST; list[0] = "2"; System.out.println(App.LIST[0]); } }
Yukarda yer alan main() metodunda final olan LIST degiskeninin ihtiva ettiği array değiştirilmektedir. Bu sorunu ortadan kaldırmak için LIST değişkeni private yapılabilir ve bu değişkeni baz alarak içeriğinin değiştirilemeyeceği bir array değerini geri döndüren metot oluşturulabilir. Bunun bir örneği aşağıda yer almaktadır:
import java.util.Arrays; import java.util.Collections; import java.util.List; public class App { private static final String[] LIST = {"1","2","3"}; public static final List<String> getList() { return Collections.unmodifiableList(Arrays.asList(App.LIST)); } public static void main(String[] args) { List<String> list = App.getList(); list.remove(0); System.out.println(list); } }
Bu program koşturulduğunda alınacak hata şu şekildedır:
Exception in thread “main” java.lang.UnsupportedOperationException
at java.util.Collections$UnmodifiableList.remove(Collections.java:1162)
at test.App.main(App.java:22)
Bu şekilde final olarak tanımladığımız LIST değişkenin ihtiva ettiği değerleri üzerinde oynama yapmak mümkün değildir. getList() metodu bünyesinde Collections.unmodifiableList() ile içeriğinin değiştirilmesi mümkün olmayan bir liste oluşturulmaktadır.
EOF ( End Of Fun)
Özcan Acar
Teşekkürler çok faydalı bir not olmuş, kitaplarınız dan da faydalanıyoruz.
Merhaba,
Bu yöntemi adı Defensive Copy Patterndir. Bununla ilgili ufak bir yazı kaleme almıştım zamanında :
https://www.dropbox.com/s/q1537xfgjgnlwyk/Defensive%20Copy%20Pattern.pdf
Buradan bakabilirsiniz. İyi çalışmalar..
Teşekkürler çok açıklayıcı olmuş. Yeni başlayanlar için şu yazıyı da önerebilirim: http://www.seckintozlu.com/456-javada-final-anahtar-kelimesi-ve-kullanimi.html
teşekürler hocam