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
Java kategorisinden son yazılar
- Java 9 ile Modül Bazlı Yazılım - February 3rd, 2018
- 2015 Yılına Geldik, Hala Spring’le Birlikte İnterface sınıf mı Kullanmak Zorundayız? - May 23rd, 2015
- JVM Nasıl Çalışır Yazı Serisi - Java Dilinde Neden Göstergeçler (Pointer) Yok? - December 30th, 2014
- JVM Nasıl Çalışır Yazı Serisi - Java String Nesnelerinin Hafıza Kullanımı Nasıl Azaltılır? - September 18th, 2014
- Java’ya Nereden Başlamalıyım? - April 2nd, 2014
- java.lang.IncompatibleClassChangeError: Implementing class Nedir ve Analizi Nasıl Yapılır? - March 15th, 2014
- Yazılımcının Verimliliğini Artıran Eclipse Ayarları - January 1st, 2014
- Java Generics Get ve Put Prensibi - January 30th, 2013
- Uzaktan Eşli Programlama - September 30th, 2012
- Sorumluluk Sahibi Olmak - August 20th, 2012
Aysun ALTUNKAYNAK
19 Şubat 2010Teşekkürler çok faydalı bir not olmuş, kitaplarınız dan da faydalanıyoruz.
Burhan ARAS
24 Haziran 2014Merhaba,
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..
Ahmet Burcak
06 Ocak 2015Teş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
msoner
29 Nisan 2015teşekürler hocam