Kısa cevap: eğer onları güvenle kullanırsanız güvenlidir :)
Snarky cevap: söyle sen özelliklerin demek ve belki Sana daha iyi bir cevap vereceğiz :)
Tüm ciddiyetle, "özellik" terimi iyi tanımlanmamıştır. Çoğu Java geliştiricisi, Scala'da ifade edildiği şekliyle özelliklere en çok aşinadır, ancak Scala, isim veya fiili olarak niteliklere sahip ilk dilden uzaktır.
Örneğin, Scala'da özellikler durum bilgilidir ( var
değişkenlere sahip olabilir ); Fortress'te saf davranışlardır. Java'nın varsayılan yöntemlere sahip arabirimleri durumsuzdur; bu onların özellik olmadığı anlamına mı geliyor? (İpucu: bu hileli bir soruydu.)
Yine Scala'da özellikler doğrusallaştırma yoluyla oluşturulur; sınıf eğer A
özellikleri uzanır X
ve Y
, hangi ardından sırası X
ile Y
arasındaki çatışmaları nasıl belirler karıştırılır X
ve Y
çözülür. Java'da, bu doğrusallaştırma mekanizması mevcut değildir (kısmen "Java'ya benzemediği için reddedilmiştir.)
Arayüzlere varsayılan yöntemler eklemenin en yakın nedeni arayüz gelişimini desteklemekti , ancak bunun ötesine geçtiğimizin de farkındaydık. Bunun "arayüz evrimi ++" veya "özellikler -" olduğunu düşünmeniz, kişisel bir yorumlama meselesidir. Bu nedenle, güvenlik hakkındaki sorunuza cevap vermek için ... mekanizmanın desteklemediği bir şeye isteyerek esnetmeye çalışmak yerine, aslında neyi desteklediğine bağlı kaldığınız sürece, iyi olmalısınız.
Temel tasarım hedeflerinden biri , bir arayüzün istemcisinin bakış açısından , varsayılan yöntemlerin "normal" arayüz yöntemlerinden ayırt edilemez olması gerektiğiydi. Bir yöntemin öntanımlılığı, bu nedenle, sadece arayüzün tasarımcısı ve uygulayıcısı için ilginçtir .
Tasarım hedeflerine uygun olan bazı kullanım durumları şunlardır:
Arayüz gelişimi. Burada, mevcut bir arayüze, o arayüzdeki mevcut metotlar açısından mantıklı bir varsayılan uygulamaya sahip olan yeni bir metot ekliyoruz. Bir örnek , varsayılan uygulamanın yöntem açısından yazıldığı forEach
yöntemin eklenmesi olabilir . Collection
iterator()
"İsteğe bağlı" yöntemler. Burada, bir arayüzün tasarımcısı, "Uygulayıcıların, gerektirdiği işlevsellik sınırlamalarıyla yaşamak istiyorlarsa, bu yöntemi uygulamalarına gerek yoktur" diyor. Örneğin, Iterator.remove
atan bir varsayılan verildi UnsupportedOperationException
; uygulamalarının büyük çoğunluğu Iterator
zaten bu davranışa sahip olduğundan, varsayılan yöntem bu yöntemi esasen isteğe bağlı kılar. (Davranış AbstractCollection
varsayılan olarak ifade edilmişse, Collection
aynı şeyi mutatif yöntemler için yapabiliriz.)
Kolaylık yöntemleri. Bunlar, kesinlikle kolaylık sağlamak için olan, yine genellikle sınıfta varsayılan olmayan yöntemler açısından uygulanan yöntemlerdir. logger()
İlk örnekteki yöntem bu makul bir resmidir.
Combinators. Bunlar, mevcut örneğe dayalı olarak arabirimin yeni örneklerini somutlaştıran bileşimsel yöntemlerdir. Örneğin, yöntemler Predicate.and()
veya Comparator.thenComparing()
birleştiricilerin örnekleridir.
Varsayılan bir uygulama sağlarsanız, @implSpec
uygulayıcıların yöntemi geçersiz kılmak isteyip istemediklerini anlamalarına yardımcı olmak için varsayılan için bazı belirtimler de sağlamalısınız (JDK'da bunun için javadoc etiketini kullanıyoruz ). Kolaylık yöntemleri ve birleştiriciler gibi bazı varsayılanlar neredeyse hiçbir zaman geçersiz kılınmaz; diğerleri, isteğe bağlı yöntemler gibi, genellikle geçersiz kılınır. Varsayılanın ne yapmayı vaat ettiği hakkında yeterli spesifikasyon (yalnızca dokümantasyon değil) sağlamanız gerekir, böylece uygulayıcı bunu geçersiz kılmak gerekip gerekmediğine dair mantıklı bir karar verebilir.