Artık bir Java Arayüzündeki tüm yöntem bildirimleri kamuya açık değil, yöntemler bu değiştiricilerle bildirilmeli mi?


14

Java 8'den başlayarak, defaultarayüzlere yöntemler tanıtıldı. Etkili, bu araçlar bir in değil tüm yöntemler bu interfacevardır abstract.

Java 9 (belki) ile başlayarak, privateyöntemlere izin verilecektir. Bu, bir interfaceiçindeki tüm yöntemlerin olmadığı anlamına gelir public abstract.

"Java arabirimindeki yöntemler publicerişim değiştiriciyle veya değiştiriciyle bildirilmeli mi?" /programming/161633/should-methods-in-a-java-interface-be-declared-with-or-without-a-public-access-m adresindeki Stack Overflow'da istendi

Orada, cevapların çoğu public abstractbunun kullanılmaması gerektiğini savundu çünkü bir yöntemdeki hiçbir yöntem interfacebaşka bir şey olamaz public abstract. Artık durum böyle değil.

Peki, arayüzlerin bu yeni özellikleri ışığında, public abstractanahtar kelimeler bir Java arayüz yöntemi bildiriminde kullanılmalı mıdır?

Özel ortamımda, zaman zaman yazılım kodunu deneyimli, ancak Java'da deneyimli olmayan, Java kodunu okuyan insanlara sahip olacağız. public abstractAnahtar kelimeleri dışarıda bırakmanın artık arayüzlerin bu anahtar kelimeleri kullanmak için nasıl farklı kurallara sahip olduğuna dair geçmişe aşina olmayanlar için ek bir karışıklık yaratacağını hissediyorum .


5
Java 8 JLS'yi kontrol ettiniz mi? SO'daki kabul edilen eski yanıttaki bölümün aynısı , varsayılan yöntemlerin kullanılmasının öneriyi, aynı yedekleme düşüncelerine dayalı olarak değiştirmediğini göstermektedir: " defaultDeğiştirici veya değiştiriciden yoksun bir arabirim yöntemi staticdolaylı olarak abstract... İzin verilir, ancak abstractböyle bir yöntem bildirimi için değiştiriciyi yedek olarak belirtmek için bir stil meselesi olarak önerilmez . " Neden her şeyin değişmesini bekliyorsunuz?
gnat

3
İşlerin değişebileceğini düşündüm, çünkü bir yöntemin dolaylı abstractolarak koşullanması gittikçe kıvrılıyor. Java 9'da aynı cümle, "Bir değiştirici, değiştirici veya defaultdeğiştirici içermeyen bir arabirim yöntemi dolaylı olarak soyuttur ..." Ayrıca, anahtar sözcükleri açıkça kullanmamaya ilişkin yardımcı argümanlar, yani tüm arabirim yöntemleri , şimdi tartışmalı. staticprivatepublic abstract
David Campbell

TBH "Varsayılan" yöntemlerin ardındaki mantığı anlamıyorum ve statik yöntemler bile normalde arayüzlerin yapmak istediği kapsamın dışına çıkıyor. Arayüzlerin betonla kaplanması gerekmez. Bu yüzden referanslar için yararlı türlerdir.
Trixie Wolf

1
@TrixieWolf varsayılan yöntemleri arabirimlerin gelişmesine izin verir. Önceden ve sınıfların aksine, bir yöntem eklemek her uygulamayı kıracaktı; şimdi, iyi bir aday temerrüde sahip olduğunuz sürece bir arayüz geliştirebilirsiniz. Eklenmesini düşünün streamiçin java.util.Collectionya Map.getOrDefault(). Alternatif olarak, yeni bir alt arabirim oluşturmak ve Graphics2D gibi herkesi mahvetmek ve hiç kimse bundan hoşlanmadı!
SusanW

Yanıtlar:


2

StackOverflow yanıtını genişletmek için:

  1. publicErişim değiştirici çünkü gerekli değildir

    Bir arayüz gövdesindeki her yöntem bildirimi dolaylı olarak kamuya açıktır (§6.6). Bir arabirimdeki bir yöntem bildirimi için genel değiştiriciyi gereksiz olarak belirtmesine izin verilir, ancak bir stil meselesi olarak önerilmez. ( Bölüm 9.4 )

  2. abstractErişim değiştirici çünkü gerekli değildir

    Varsayılan yöntem, varsayılan değiştiriciye sahip bir arabirimde bildirilen bir yöntemdir ; Bunu gövdesi her zaman olduğu bir blok ile temsil edilen .

    Ve...

    Varsayılan bir değiştirici veya statik bir değiştirici içermeyen bir arabirim yöntemi dolaylı olarak soyuttur , bu nedenle gövdesi bir blok değil noktalı virgülle temsil edilir .

Varsayılan yöntemler göz önüne alındığında sahip bir gövde ve bu bilmediğimiz doğal soyut, ve bir arayüz üzerinde her yöntem beyanı doğal olarak herkese açıktır, ya anahtar kelimeyi belirtmek gerekmez.


Bir cevaptaki yorumlardan biri:

Onları düşündürmeyin! Stil polisine rağmen, her zaman daha önce kamuoyu özetini ekledim, çünkü işleri netleştirdi ve okuyucuya hatırlattı. Şimdi haklıyım çünkü Java 8 ve 9 işleri karmaşıklaştırıyor (user949300)

StackOverflow sorusuna (18 kez oy verildi) bir yorum bunu reddeder:

Kötü çünkü halka açık olarak yazmak, halka açık olmayabileceğini ima ediyor (Pacerier)

Kodun, özellikle arayüzlerin etkileri önemlidir.


StackOverflow'dan alıntı yaptığınız yorum artık güncel değil. Genel değiştiriciyi eklemenin, kamuya açık olamayacağını ima ettiği için kötü yazma olduğunu söylemek çelişkilidir. Yöntem herkese açık olmayabilir.
David Campbell

@DavidCampbell: Java 9 çıktıktan sonra bu sorunun daha iyi sorulabileceğini düşünüyorum. :) Henüz kesinleşmemiş Java teknik özellikleri bu soruya cevap verebilir.
Greg Burghardt

1

Bir blok deyimi imalarının olmaması yeterli değil mi? extends ObjectZımni olduğu halde beyan eder misiniz ?

Geliştirici artıklığı anlamıyorsa, dil özelliğinin arkasındaki kavramı tam olarak anlayamayabilir , bu da değiştiriciler hakkında karıştırılmasından daha büyük bir sorundur.

Geliştirici, bir arabirimin amacının, bir istemcinin bir nesneyle nasıl etkileşime girebileceğini tanımlayan bir sözleşme oluşturmak olduğunu anlamalıdır. Bu, arabirimde nesne etkileşimi için kullanılan herhangi bir yöntemin istemcilere açıklanması gerektiğini gösterir.

Bir yöntemi özel olarak bildirirseniz, bu yöntemin istemciler tarafından çağrılmadığını açıkça belirtirsiniz; bu, arabirimler durumunda kolayca çıkarılamayacak bir şeydir.


2
Onları düşündürmeyin! public abstractStil polisine rağmen her zaman daha önce ekledim , çünkü işleri netleştirdi ve okuyucuya hatırlattı. Şimdi haklıyım çünkü Java 8 ve 9 şeyleri karmaşık hale getiriyor :-). Java zaten çok fazla.
user949300

1
@ user949300 extends ObjectDoğrudan türetilmiş her sınıfa da ekler misiniz Object? Bir geliştiricinin zaten bilmesi gereken bilgiler, bu yüzden çıkartılıyor. Ekranda ne kadar az bilgi kullanılırsa, önemli bilgileri işlemek o kadar kolay olur. Umarım seni karanlık tarafa gelmeye ikna ettim (anladın mı? Çünkü örtük şeyler görülemez). Değilse, bir atışa değdi haha. Sonunda, kodun geliştirici için yönetilmesini kolaylaştıran
şeylere iner

@ user949300 Bunu yaparak, arabirim yöntemleri bu bildirimleri içermediğinde ne anlama geldiğiyle ilgili karışıklık yaratma olasılığınız daha yüksektir. yani, kodunuza bakarak java öğrenen herhangi bir geliştirici varsa, potansiyel olarak arayüz bildirimlerinin sözdizimi konusundaki anlayışlarını engellemiş olursunuz.
JimmyJames

Vince, hayýr, Object'i uzatmazdým, ama bunu yapan bir kod gördüđümde form atmýyorum. @JimmyJames, biri olan öğelere genel soyut eklemek tutarlı ise, herhangi bir karışıklık görmüyorum. Bir şey mi kaçırıyorum? OTOH, dağınıklık konusundaki görüşünü görüyorum. Örneğin, finalkomik bir şey gerektirmedikçe yöntem argümanlarından önce
eklemiyorum

@ user949300 Bir kullanıcı zaten değiştiricilerin eksikliğine ve bunun nedenine maruz kaldıysa, değiştiricilerin onları gördüklerinde neden orada bulunduğunu sorgulayabilir, bunun arkasında sadece açık olmaktan başka gerçek bir neden olabileceğini varsayabilir. . Görürsem extends Objectform atmazdım , ama kesinlikle bir bayrak kaldırıp nedenini sorgulamama neden olurdu. Postada belirttiğim gibi, böyle şeyler yapmak, geliştiricinin bir şeyin nasıl çalıştığını yanlış anlayabileceği anlamına gelebilir (tüm nesnelerin zaten genişlediğini Object, dolayısıyla açık uzantıyı
bilmeyebilir
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.