Java'da neden 'yalnızca alt sınıflar' erişim değiştiricisi yok?


17

Java'da, yöntemler için kullanılabilir dört erişim değiştirici vardır:

public - herhangi bir sınıf bu yöntemi kullanabilir.

protected - aynı paketteki sınıflar ve herhangi bir paketteki alt sınıflar bu yöntemi kullanabilir.

private - yalnızca bu sınıf bu yöntemi kullanabilir.

no modifier ("package private") - yalnızca aynı paketteki sınıflar bu yöntemi kullanabilir.

Sık sık olan şey, bir alt sınıfta tüm alt sınıfların kullanabileceği yararlı yöntemlere sahip olmak istiyorum. Ancak diğer sınıfların bu yönteme erişmesi anlamlı olmaz ve bir anlamda kapsüllemeyi bozar.

Ben üst sınıfta bu yararlı yöntemler beyan etmek zorunda Yani publicya protectedpakette en azından tüm diğer sınıfların önlerine çıkarıyor. Sadece alt sınıflar tarafından kullanılması amaçlansa da.

subclasses-onlyJava'da erişim değiştirici olmamasının bir nedeni var mı? Bana çok tuhaf geliyor. Bir şey mi kaçırıyorum?

Ayrıca, subclasses-onlydeğişkenleri yalnızca alt sınıflara göstermek istediğinizde bir erişim değiştirici de yararlı olacaktır. Hangisi çok oluyor.

Yanıtlar:


10

Çünkü korumalı değiştiriciyi kullanarak ve yalnızca üst sınıfın ve alt sınıflarının aynı pakette bulunduğunu zorlayarak yalnızca alt sınıf değiştiricisini taklit edebilirsiniz .

Gerçekten iyi bir uygulamadır, çünkü paketler sadece uyum açısından büyük projelerin düzenlenmesine yardımcı olmakla kalmaz, aynı zamanda aynı paketteki sınıfların bir miktar bağlantıya sahip olabileceğini gösterir.


15
"ve sadece üst sınıf ve alt sınıflarının aynı pakette olduğunu" - Şimdi, bunu nasıl yapabilirim ?!
JimmyB

1
Ve sonra yalnızca paket erişim değiştiricisini kullanamazsınız. Ve aptalca paketlere ihtiyacın var. Bu pratik bir çözüm değil.
user253751

13

Java başlangıçta böyle bir değiştiriciye sahipti. private protectedJava 1.0 ile yazılmış ancak kaldırılmıştır.

Bunun ekstra karmaşıklığın maliyete değmediği bir karar çağrısı olduğunu varsayıyorum.

Her dil özelliğinin bir maliyeti vardır: yeni programcılara öğretilmesinde; belgelerde; derleyici, JVM ve dev araçlarında uygulamada; programın doğruluğu hakkında muhakemede; gelecekteki dil gelişimini kısıtlamada; ve dahası. Dil, potansiyel N ile, birbirleri ile etkileşim özellikleri 2 etkileşimler.

Java programcılarının yüzde kaçı Java dili ve VM spesifikasyonlarını okudu? Bahse girerim, küçük bir yüzde.

private protectedPaket modülerliğin ana birimi olduğundan , özelliğin faydası küçüktü.


1
1.0 öncesi bir Java sürümü vardı?
Mark Yisri

1
@MarkYisri Java'nın 1995 yılında herkese açık alfa ve beta sürümleri vardı ve onlara karşı oldukça fazla kod yazıldı.
David Moles

4

Acess kontrolü, sınıf yöntemleri ve uygulamaları hakkında sınıfınızla çalışan hayali bir geliştiriciyle yapılan bir örtüşmenin sonucu olarak düşünülebilir ...

SİZ: x yapmak istediğinizi söyleyin, doX yöntemini çağırıyorsunuz .. DEV: Bana daha fazlasını anlat ... argümanlar nelerdir?

Bu herkese açık ...

SİZ: DOX'un içinde diyorum ... DEV: Vay, çok fazla bilgi, umrumda değil. Sadece nasıl kullanılacağını bilmek istiyorum. Bana başka bir şey söyle.

Bu özel ...

SİZ: Alt sınıflama yaparken, doX ve doY'm var doIt bunu yapar .. DEV: Evet, alt sınıf yapacağım, daha fazlasını anlat ...

Bu korunuyor ...

SİZ: Bir saat sonra tatile çıkıyorum, önümüzdeki 6 ay boyunca gideceğim. Patron bu köpek yavrusu senin olduğunu söylüyor! Hoşçakal. DEV: Bekle henüz gitme, bana her şeyi anlat ...

Bu paket.

YOU: doItWhen yöntemi sadece bu sınıf tarafından çağrılır ve on yıl içinde değişmez. Bu ... DEV: Vay, 50 dakikaya düştük. Sonraki mülk ve daha hızlı konuşun.

Bu korunan özel ...


3

Bu zaten var. Korunmaktadır.

Paket içinde hangi sınıfların bulunduğunu kontrol edebilirsiniz. Pakette başka bir sınıf yoksa ve belirli bir değişken veya yöntem korunuyorsa, 'yalnızca alt sınıflardır'.

Bununla birlikte, pakette hangi sınıfların var olduğunu kontrol edersiniz. Korumalı yöntemleri veya değişkenleri kullanmamayı tercih edebilirsiniz.


3
Belirli ayrılmış sistem paketlerinin yanı sıra, herhangi bir pakete sınıf ekleyemez miyim?
David Moles

@David IIRC evet, ancak başka bir JAR'ın paket alanlarına erişmenize izin vermeyecek, bu yüzden aynı pakete koysanız bile, başka bir JAR'daysa erişemezsiniz. Ancak, aynı JAR içinden bahsediyorsanız, evet, ona erişebilirsiniz, ancak söz konusu JAR'ı değiştirebiliyorsanız, erişim değiştiriciyi de kolayca değiştirebilirsiniz.
Pokechu22

1
@ Pokechu22 Sanırım bu korumayı almak için JAR'ı olumlu bir şekilde mühürlemelisin , ama iyi bir nokta.
David Moles
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.