21 Ekim 2021

Interface Default Methods

ile gökhan

Java 8 öncesinde arayüzlerde(interface) metot tanımları abstract yani gövdesiz olarak yapılmaktaydı. Java 8 ile beraber gövdeli somut metotlar oluşturabilmemizi sağlayan default metotlar eklendi. Default metotlar oluşturabilmemiz için metodumuzda default anahtar kelimesini kullanmamız gerekmekte. Peki, bu default metotlar bize ne fayda sağlayacak? Örneğin uygulamamızda bir arayüz olduğunu ve abstract metotları olduğunu düşünelim. Bu arayüzü implement eden çok sayıda sınıfımız olsun. Eğer arayüzümüzdeki metotları güncellersek, tüm bu arayüzü implement eden sınıflar kendilerini güncellemek zorunda kalacaklar. Bu sorunu ilgili metotları default metot olarak tanımlayarak aşabiliriz. Böylece default olarak tanımlanan metodu implement eden sınıflar gerektiğinde mevcut halini kullanabilecek, hem de esınıflar default metotu override ederek istedikleri ek özellikleri metotlara kazandırabilecekler. Kısacası, default metotlar, uygulamalarda geriye dönük uyumluluk ve geliştirme faaliyetlerinde yardımcı bir özellik kazandıracaktır.

Aşağıda örnek bir default metodun tanımı görülmektedir :

public interface DefaultInterfaceSample {
    boolean control();
    public default double getWeight(){
        return 12.0;
    }   
}

Bu arayüzü implement eden Vehicle sınıfı tarafından default metot override edilerek istenen değerin dönmesi sağlanıyor:

public class Vecihle implements DefaultInterfaceSample{

    @Override
    public boolean control() {
         return true;
    }

    @Override
    public double getWeight() {
        return 38.0; 
    }  
}

Default metot oluşturken aşağıdaki kurallara uyulması gerekmektedir:

  • Default metot, yalnızca interface içinde bildirilebilir.
  • Default metot, default anahtar sözcüğü ile bildirilmelidir.
  • Default metot, arayüzü implement eden bir sınıf tarafından override edilebileceği için static, final veya abstract olamaz.
  • Arayüzdeki tüm metotlar gibi, default metotlar public’tir. Private ve ya protected olarak işaretlenemez.

Default Metot/Multiple Intheritance

Arayüzler default metotlara izin vererek, bir sınıfın birden çok arayüz implement edebileceği gerçeğiyle birleştiğinde, Javanın çoklu kalıtım sorunlarına yol açtığını fark edebilirsiniz. Örneğin, Car ve Truck isimli iki arayüzümüzü Traffic isimli sınıfımıza implement edelim:

public interface Car {
    public default int getSpeed(){
        return 20;
    }
}
public interface Truck {
    public default int getSpeed(){
        return 40;
    }
}
public class Traffic implements Car, Truck{  // DOES NOT COMPILE
    public static void main(String[] args) {
        System.out.println(new Traffic().getSpeed());
    }
}

Yukarıdaki örnekte, Traffic sınıfı iki arayüzde tanımlı olan getSpeed() default metodunu devralır. Peki hangisi kullanacak? Bu yüzden bu kod derlenmeyecektir. Ancak varsayılan metot override edilirse kod hata vermeyecektir:

public class Traffic implements Car, Truck{  
    
    @Override
    public int getSpeed() {
        return 200; 
    }

    public static void main(String[] args) {
        System.out.println(new Traffic().getSpeed());     
    }
}