Java 8 ile birlikte arayüzlerde statik yöntemler ortaya çıkmıştır. static anahtar kelimesi ile tanımlanır ve doğrudan arayüzde uygulanır. Statik yöntemler, uygulayan sınıflar tarafından miras alınmaz ve arayüzün adıyla çağrılır.
interface MathUtils { static int sum(int a, int b) { return a + b; } }
MathUtils.sum(1, 2);Soru: Arayüzün statik bir yöntemi uygulayan sınıfın bir nesnesi üzerinden çağrılabilir mi?
Cevap: Hayır, bir arayüzün statik yöntemi her zaman arayüzün adıyla çağrılır, uygulama sınıfının örneği veya adı üzerinden değil. Aşağıdaki örnek bir derleme hatası verecektir:
MathUtils utils = new SomeMathUtilsImpl(); utils.sum(1, 2); // Hata! Gerekli: MathUtils.sum(1, 2)
Hikaye
Geliştiriciler, bir arayüzdeki statik yöntemi uygulayan sınıfta "geçersiz kılmaya" çalışarak bu yöntemi örnek üzerinden çağıracaklarını düşündüler. Sonuç olarak her zaman arayüzdeki sürüm çağrıldı ve bu, kullanırken yanlış iş mantığına yol açtı.
Hikaye
Kullanım amaçlı yöntemlerin bir sınıftan arayüze taşınması esnasında bazı kodlar örnek üzerinden çağrıyordu:
obj.method(), bu artık mümkün olmadı ve tüm projede çağrılarıInterfaceName.method()şeklinde yeniden düzenlemek zorunda kaldılar.
Hikaye
Eski Java sürümlerinin desteği, arayüzlere statik yöntemler eklendikten sonra derleme hatalarına yol açtı. Geliştiriciler, CI'de hangi derleyici sürümünün kullanıldığını kontrol etmedikleri için inşa düzenli olarak bozulmaya başladı.