Java 8 ile birlikte varsayılan yöntemler kavramı ortaya çıktı — bu, arabirim içinde tanımlanan ve uygulanmış yöntemlerdir. Mevcut uygulamalarla uyumu bozmeden arabirime yeni yöntemler eklemeye olanak tanır.
Sözdizimi:
public interface MyInterface { default void printHello() { System.out.println("Merhaba!"); } }
Özellikler ve ayrıntılar:
Object sınıfındaki yöntemleri (örneğin, equals, hashCode) geçersiz kılabilir.Bir sınıf, aynı varsayılan yönteme sahip iki arabirimi uygularsa ve bu yöntemi geçersiz kılmazsa ne olur?
Cevap: Derleyici "class... inherits unrelated defaults for ... from types ... and ..." hatasını verir ve bu yöntemi derlemede açıkça uygulamak gerekir.
Örnek:
interface A { default void doSomething() { System.out.println("A"); } } interface B { default void doSomething() { System.out.println("B"); } } class C implements A, B {} // Derleme hatası!
Çözüm:
class C implements A, B { @Override public void doSomething() { A.super.doSomething(); // veya B.super.doSomething() } }
Hikaye
Bir ekip projesinde API birleştirme için ortak arabirime varsayılan bir yöntem eklendi. Eski arabirim uygulamaları yeni yöntemi geçersiz kılmadı, bu da beklenmedik bir davranışa sebep oldu çünkü varsayılan uygulama beklenen mantık yerine çalıştı. Sonuç olarak, kullanıcılar işlevsellik kaybı fark etti.
Hikaye
Bir kütüphaneyi genişletirken, geliştiricilerden biri ortak arabirime iş mantığı içeren bir varsayılan yöntem ekledi. Başka bir arabirimde farklı bir davranışa sahip aynı yöntemin eklenmesi, miras alma çelişkisine neden oldu ve yeni uygulamaların derlenmesini engelledi.
Hikaye
Bir geliştirici, arabirimde
hashCodeadıyla bir varsayılan yöntem kullanmaya çalıştı ve bunun alt sınıflardaki yöntemin geçersiz kılınmasına etki edeceğini umdu, fakat derleyici bunu yapmasına izin vermedi. Bu, hata nedenlerinden sonda uzunca bir müzakereye ve arabirim yapısının yeniden tasarımına yol açtı.