Java 8'in en kullanışlı özelliklerinden biri default
arabirimlerdeki yeni yöntemlerdir. Bunların tanıtılmasının esasen iki nedeni vardır (başkaları da olabilir):
- Gerçek varsayılan uygulamaları sağlama. Misal:
Iterator.remove()
- JDK API gelişimine izin verme. Misal:
Iterable.forEach()
Bir API tasarımcının bakış açısından, örneğin arayüz yöntemleri üzerinde diğer değiştiricileri kullanmak isterdim final
. Bu, uygulama yöntemleri eklenirken, uygulama sınıflarında "yanlışlıkla" geçersiz kılmaları önlerken yararlı olur:
interface Sender {
// Convenience method to send an empty message
default final void send() {
send(null);
}
// Implementations should only implement this method
void send(String message);
}
Yukarıdaki Sender
bir sınıf zaten yaygın bir uygulamadır :
abstract class Sender {
// Convenience method to send an empty message
final void send() {
send(null);
}
// Implementations should only implement this method
abstract void send(String message);
}
Şimdi default
ve final
açıkça anahtar kelimelerle çelişiyor, ancak varsayılan anahtar kelimenin kendisi kesinlikle gerekli olmayacaktı , bu yüzden bu çelişkinin "vücutla sınıf yöntemleri" (sadece yöntemler) ve "arayüz arasındaki ince farkları yansıtmak için kasıtlı olduğunu varsayıyorum. gövdeli yöntemler " (varsayılan yöntemler), yani henüz anlamadığım farklılıklar.
Bir zamanlar, Brian Goetz'e atıfta bulunarak , arayüz yöntemleri gibi static
ve final
arayüz yöntemleri üzerindeki değiştiricilere yönelik destek henüz tam olarak araştırılmadı :
Diğer kısım, son yöntemler, özel yöntemler, korunan yöntemler, statik yöntemler vb.Gibi arayüzlerde sınıf oluşturma araçlarını ne kadar destekleyeceğimizdir. Cevap şu: henüz bilmiyoruz.
2011'in sonundaki o zamandan beri, açıkça, static
arayüzlerdeki yöntemlere destek eklendi. Açıkçası, bu JDK kütüphanelerine kendileri gibi çok değer kattı Comparator.comparing()
.
Soru:
Java 8 arayüzlerine hiçbir zaman neden olmadı final
(ve ayrıca static final
)?
final
bir yöntemin geçersiz kılınmasını önler ve arabirimlerden miras alınan yöntemleri nasıl geçersiz kılmanız GEREKİR, onu sonlandırmanın neden mantıklı olduğunu görmüyorum. Yöntemin bir kez geçersiz kılınmasından SONRA son olduğunu belirtmedikçe .. Bu durumda, belki qas zorlukları var mı? Bu hakkı anlamıyorsam, lütfen bana kmow izin ver. İlginç görünüyor
final
uygulama sınıflarının bir arabirim yönteminin varsayılan uygulamasını geçersiz kılmasının önlenmesinde bir kullanımı olacaktır.