22 Mayıs 2019 Çarşamba

Interface - Java 8 Default Method

Giriş
Java 8'den itibaren bir arayüz default metodlara sahip olabilir ancak halen state/field/property sahibi olamaz. Örneğin artık Iterable arayüzü remove default metoduna sahip. Bu metod UnsupportedOperationException fırlatıyor. Böylece excepion fırlatan remove metodu yazmamıza gerek kalmadı.

Interface için default metod özelliği C# 8 ile de .Net dünyasında geldi.

Java 9 ile interface içinde private metod da olabiliyor.

1. Tanımlama Konusu
Interface'teki metodun başına default anahtar kelimesi eklenir.
Örnek
Collection sınıfındaki stream default metodu şöyledir.
default Stream<E> stream() {
  return StreamSupport.stream(spliterator(), false);
}
2. Lambda İle Kullanma Konusu
Java 8 ile geliyor. Default metodlar ile lambda'yı kullanmak daha kolay hale geldi. Açıklaması şöyle
one of the major reasons for introducing default methods in interfaces is to enhance the Collections API in Java 8 to support lambda expressions.
Örnek
Collection sınıfındanki forEach default metodu şöyledir. Böylece lambda ile çok kolay kullanılabilir.
default void forEach(Consumer<? super T> action) {
  Objects.requireNonNull(action);
  for (T t : this) {
    action.accept(t);
  }
}
3. Kalıtım Konusu

a. You get what is in base interface
Eğer birbirinden kalıtan iki arayüz varsa en üstteki arayüzün default metodunu kullanabiliriz.

b. You may override a default method
Eğer birbirinden kalıtan iki arayüz varsa, kalıtan arayüz ata arayüzden gelen default metodu override edebilir.

c. Ata sınıftaki metod arayüzdeki default metodu ezer
Ata sınıf ve ata arayüzde aynı metod varsa, ata sınıftaki seçilir.

d. Ata sınıftaki metod yoksa ve iki ata arayüzdeki aynı default metod varsa
Bu durumda kod derlenmez. İllaki bir arayüzdeki default metodu çağırmak istersek şöyle yaparız.
MyInterface.super.foo ();

Örnek
Elimizde şöyle bir kod olsun.
interface B {
    default void x() { System.out.println("B::x"); }
}

interface C {
    default void x() { System.out.println("C::x"); }
}

class D implements B, C {}
Şu hatayı alırız.
D inherits unrelated defaults for x() from types B and C
Aşmak için şöyle yaparız. Burada 2. maddedeki gibi default metod override ediliyor.
class D implements B, C {
  @Override
  public void x() {
    B.super.x();       // Note explicit interface names
    C.super.x();
  }
}


Hiç yorum yok:

Yorum Gönder