Javada final anahtar kelimesinin kullanımı

Java programlama dilinde önemli bir yere sahip olan final anahtar kelimesi birçok projede farklı amaçlarla kullanmaktadırlar. Birçok yazılımcının kafasını karıştıran bu değişkenin ne amaçla ve nerelerde kullanılacağı hakkında bazı örneklerle bilgiler sunacağız. final anahtar kelimesi hem Java sınıflarında hem metodlarda hem parametrelerde hemde değişkenlerde kullanılabilmektedir. Makalemizde aşağıda bulunan maddeler sırasıyla anlatılacaktır:
  1. Değişken seviyesinde final kullanımı
  2. Metod seviyesinde final kullanımı
  3. Sınıf seviyesinde final kullanımı
1. Değişken seviyesinde final kullanımı:
Java'da sınıflar içerisinde bulunan değişkenler, oluşturulan her nesne için farklı alanda  tekrar tekrar oluşturulmaktadır. final anahtar kelimesini kullanılan değişkenler ilk değerlerinin setlenmesinin ardından tekrardan değiştirilemezler. final değişkenlerine değerler ya tanımlamanın gerçekleştirildiği esnada yada sınıfa ait initalize (yapıcı) metodu çağrıldığında setlenmelidir. Aksi takdirde uygulama hata verecektir. Aşağıdaki Urun sınıfımızda urunadi degiskenini final olarak setleyelim:
  1. package com.yazilimdersi.info.finalkullanimi; 
    
    public class Urun{ 
    
        #urunadi final değişken olarak setlendi.
        private final String urunadi;
        
        public void urunAdiYazdir() {
            System.out.println("urunadi : "+urunadi);
        }
    }
Yukarıda bulunan sınıfta urunAdiYazdir() metodundaki urunadi değişkenine herhangi bir atama yapılmadan kullanılmak istenildiğinden derleme sırasında The blank final field urunadi may not have been initialized şeklinde bir hata ile karşılaşacaksınızdır. Bu hata final olarak belirlenen urunadi değişkenini herhangi bir değer ataması yapmadığımızı belirtmektedir. Aşağıdaki kodlamada olduğu gibi metod içerisinde değer atamasını gerçekleştirelim:
  1. package com.yazilimdersi.info.finalkullanimi; 
    
    public class Urun{ 
    
        #urunadi final değişken olarak setlendi.
        private final String urunadi;
        
        public void urunAdiYazdir() {
            urunadi = "FLOWMETRE";
            System.out.println("urunadi : "+urunadi);
        }
    }
Yukarıdaki kodlamayı çalıştırdığımızda tekrar aynı hatayı alacaksınız muhtemelen. Bunun sebebi yazının başında belirttiğim üzere final değişkenlerine ait değer setlemeleri ya değişkenin tanımlandığı esnada yada sınıfa ait initialize (yapıcı) metod içerisinde gerçekleştirilmelidir. Aşağıdaki örnekte olduğu gibi direkt değişkenin tanımlandığı sırada gerçekleştirebiliriz:
  1. package com.yazilimdersi.info.finalkullanimi; 
    
    public class Urun{ 
    
        #urunadi final değişken olarak setlendi.
        private final String urunadi = "FLOWMETRE";
        
        public void urunAdiYazdir() {
            System.out.println("urunadi : "+urunadi);
        }
    }
Yukarıdaki kodlamayı derlediğimizde herhangi bir hata ile karşılaşmayacağınızı göreceksiniz. Ayrıca initialize metodu içerisinde de final değişkenine ait tanımlama şu şekilde gerçekleştirilebilir:
  1. package com.yazilimdersi.info.finalkullanimi; 
    
    public class Urun{ 
    
        #urunadi final değişken olarak setlendi.
        private final String urunadi;
        
        public Urun(String urunAdiDegiskeni) {
            urunadi = urunAdiDegiskeni;
        }
        
        public void urunAdiYazdir() {
            System.out.println("urunadi : "+urunadi);
        }
    }
Yukarıdaki kodlamayı derlediğimizde herhangi bir hata ile karşılaşmayacağınızı göreceksiniz.

Final değişkenlerinin en önemli özelliği herhangi bir değer setlendikten sonra, tekrar değer setlenememesidir. Yani initialize metodu içerisinde veya değişken tanımlanmasında setlenen değişken, başka bir metod içerisinde tekradan setlenemez.
Final değişkeninin kullanımının asıl amacı zaten setlediğimiz herhangi bir değerin tekrar değiştirilmesini istememizden dolayıdır.  
  1. package com.yazilimdersi.info.finalkullanimi; 
    
    public class Urun{ 
    
        #urunadi final değişken olarak setlendi.
        private final String urunadi;
        
        public Urun(String urunAdiDegiskeni) {
            urunadi = urunAdiDegiskeni;
        }
        
        public void urunAdiYazdir() {
            urunadi = "FLOWMETRE";
            System.out.println("urunadi : "+urunadi);
        }
    }
Yukarıdaki kodlamayı derlediğimizde şu şekilde bir hata ile karşılaşacaksınız. The final field Urun.urunadi cannot be assigned
Çoğu programda final değişkeni static anahtar kelimesiyle birlikte kullanılmaktadır. Bunlar constant olarak ifadelendirilmektedir ve bu degiskenler genellikle her sınıftan erisilebilecek degiskenler olarak kabul edilirler:
  1. package com.yazilimdersi.info.finalkullanimi; 
    
    public class Constant{ 
    
        public static final String MYSQL_HOST = "128.93.09.12";
        public static final String MYSQL_USER = "mysql_user";
        public static final String MYSQL_PASS = "password";
    
    }
 
2. Method seviyesinde final kullanımı:
Java'da sınıflar içerisinde bulunan methodlarda final anahtar kelimesi kullanılarak oluşturulabilmektedir. Ancak final tanımlı olan method hiçbir şekilde başka sınıf tarafından miras alınsa bile override edilemez. Aşağıda bulunan kodlamayı örnek verecek olursak:
  1. package com.yazilimdersi.info.statickullanimi; 
    
    public class Urun{ 
        
        #urunsayisi Sınıf değişkeni. Program çalışır çalışmaz bellekte yer oluşturulur.
        public static int urunsayisi = 0;
    
        public final int urunsayisiGetir() {
            return urunsayisi;
        } 
    
    }
    
    public class Arac extends Urun { 
        
        public int urunsayisiGetir(){
            System.out.println("urunsayisi getir");
        }
    
    }
Yukarıda bulunan kodlamada Arac sınıfı, Urun sınıfını miras almaktadır. Urun sınıf içerisinde bulunan urunsayisiGetir() metodu final olarak ayarlanmıştır. Ancak dikkat ederseniz aynı isimde bir metod Arac sınıfı içerisinde de tanımlanmış ve override edilmiştir. Bu da Cannot override the final method from urunsayisiGetir şekilde bir hataya sebep olacaktır. Bu tip hatalarla karşılaşmamak için alt sınıflarda miras alınan sınıflardaki final metodları override edilmemelidir. 

3. Sınıf seviyesinde final kullanımı:
Final değişkeni sınıf seviyesinde de kullanılmaktadır. Ancak final olarak hazırlanan sınıflar başka sınıflar tarafından kesinlikle miras alınamazlar. Bir sınıfın zaten hiçbir şekilde başka sınıf tarafından miras alınmasını istemiyorsak bu yapıyı kullanırız. Aşağıda bulunan kodlamayı inceleyelim:
  1. package com.yazilimdersi.info.statickullanimi; 
    
    public final class Urun { 
        
        #urunsayisi Sınıf değişkeni. Program çalışır çalışmaz bellekte yer oluşturulur.
        public static int urunsayisi = 0;
    
        public int urunsayisiGetir() {
            return urunsayisi;
        } 
    
    }
    
    public class Arac extends Urun { 
        
        public int urunsayisiGetir(){
            System.out.println("urunsayisi getir");
        }
    
    }
Yukarıda bulunan kodlamada Arac sınıfı, Urun sınıfını miras almaktadır. Ancak Urun  sınıfı final olarak belirlendiğinden The type Arac cannot subclass the final class Urun şekilde bir hata ile karşılaşacaksınız.

comments powered by Disqus