Java'nın “özel korumalı” erişim değiştiricisi var mı?


160

Bazı başvurular private protected(her iki kelime birlikte) olarak adlandırılan Java bir erişim değiştirici başvurmak gördük :

private protected someMethod() {

}

Bununla ilgili bulduğum sayfalardan biri burada . Okul dersim de bu erişim değiştiriciye atıfta bulundu (ve var olduğunu söyledi). Ancak bunu kullanmak Java dilinde bir hataya neden olur.

Hem değişkenler hem de yöntemler ile denedim ve var olmadığından eminim, ama ne olduğunu açıklamak istiyorum. Düşündü, sonra reddedildi mi? Yoksa daha yeni bir Java sürümünde mi kaldırıldı?

Düzenleme: protectedAnahtar kelime hakkında bilgi aramıyorum .


60
Bulduğunuz sayfa bir "Son Değiştirme Tarihi" HTTP başlığı ayarlar: Pzt, 26 Şub 1996 18:14:04 GMT!
G. Sylvie Davies

6
@Joe Soruları olabildiğince dupes olarak kapatmak için varım, ama orada birleşik değiştirici hakkında hiçbir şey görmüyorum private protected.
jpmc26

2
@ jpmc26 Bkz. "Java 1.0'da özel korumalı ek bir erişim değiştirici vardı." Ancak, buradaki cevap, tarihin çok daha iyi bir özetidir.
Joe

2
@Joe Bu cevapta gerçekten bir atıf var private protected, ama neden ya da ne olduğunu açıklamıyor, bu sorunun ne hakkında olduğu.
m0skit0

3
Başka kimse OP'nin bunu okulda öğrendiğini korkutuyor mu? Dokümanlar'dan çıkarıldıktan 20 yıl sonra? İlginç bir tarih dersi, ama yine de insanların Java 1 adlandırılmadan önce kaldırılan bir şey öğreniyor olması biraz korkutucu ...
XaolingBao

Yanıtlar:


191

Erişim değiştiricinin kaldırılması

Java ilk olarak private protecteddeğiştiriciye sahipti, ancak JDK 1.0.2'de kaldırıldı (ilk kararlı sürüm, bugün bildiğimiz Java 1.0). JDK 1.0.2 ( burada ve burada ) ile ilgili birkaç öğretici şunları söylüyor:

Not: Java dilinin 1.0 sürümü, beş erişim düzeyini destekledi: yukarıda listelenen dördü artı private protected. private protectedErişim düzeyi 1,0'dan Java üst versiyon desteklenmez; Java programlarınızda artık kullanmamalısınız.

SoftwareEngineering.SE ile ilgili başka bir cevap şöyle diyor:

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

Şimdi Java Sürüm Geçmişine bir göz atın :

JDK 1.0

İlk sürüm 23 Ocak 1996'da piyasaya sürüldü ve Oak olarak adlandırıldı. İlk kararlı sürüme JDK 1.0.2 Java 1 denir.

Bundan, sürüm 1.0.2 ile ilgili öğreticilerin dilin Oak olarak adlandırıldığı ilk sürüm olan JDK 1.0'a atıfta bulunduğu, ancak SoftwareEngineering'den alınan eğitimin sonucuna varabiliriz. 1.0, kaldırıldı.

Java 1.0 belgelerinde aramaya çalışırsanız , bulamazsınız, çünkü daha önce de belirtildiği gibi, Java 1.0 olarak bilinen JDK 1.0.2'de kaldırılmıştır. Bu, gönderdiğiniz bağlantının "Son Değiştirme Tarihi" zamanlarına baktığınızda tekrar kanıtlanmıştır. Gönderdiğiniz bağlantı en son Şubat 1996'da değiştirildi. Java 1.0 / JDK 1.0.2, private protectedkaldırıldığında, Şubat 1996'dan sonra ve spesifikasyona göre, Ağustos 1996'ya göre yayınlandı.

Kaldırılma Nedeni

Bazı kaynaklarda da nedenini açıklamak private protectedgibi, bu biri. Alıntılamak:

Özel koruma neydi?

Daha önce, Java dili, biri olan belirli değiştiricilerin kombinasyonlarına izin verdi private protected. Bunun anlamı, private protectedgörünürlüğü kesinlikle alt sınıflarla sınırlamak (ve paket erişimini kaldırmak) idi. Bu daha sonra bir şekilde tutarsız ve aşırı derecede karmaşık kabul edildi ve artık desteklenmiyor. [5]

[5] Değiştiricinin anlamı protectedJava'nın Beta2 sürümünde değişti ve private protectedkombinasyon aynı anda ortaya çıktı. Bazı potansiyel güvenlik açıkları yamaları, ancak birçok insanın kafası karıştı.

Ve SoftwareEngineering.SE de tutarsızlıklara ve ekstra karmaşıklığa değmediğini söyleyerek bunu destekliyor, bu yüzden erken kaldırıldı.

yorumlama

Tüm bunları yorumlamam, belki de Meşe günlerinde, her ikisinin birlikte var olmasına izin verildi (bu nedenle kombinasyon). Yana protectedbireyin anlamı değişmişti 1 , izin için bir ihtiyaç olmuş olabilir privateve protectedaynı zamanda. Giriş çok karmaşık hale geldi ve buna değmedi ve sonunda düştü. Java 1.0 / JDK 1.0.2 yuvarlandığında, düşürülmüştü ve bu nedenle belgelerde bulunamıyor.


1 yılında Meşe Dil Şartname , Bölüm 4.10, Değişkenler ve Yöntemler erişim , varsayılan değiştirici olduğunu kaydetti edilir protected:

Varsayılan olarak bir sınıftaki tüm değişkenler ve yöntemler korunur .

Bu, bugünkü paket erişimimiz olandan oldukça farklı. Bu ihtiyacı yolunu açtı olabilir private protected, çünkü privateçok kısıtlayıcı ve protectedfazla hafif oldu.


Eminim çok değmez - ama ne zaman olduğunu hatırlıyorum (bir çocuk olarak programlıyordum ve bir sebepten dolayı bu yeni Java şeyin içine girmiştim) ve orijinal kaynaklardan hiçbirini bulamasam - bir şeyler hatırlıyorum onları takip ettiğimde aynen böyle.
Benjamin Gruenbaum

Early on, the Java language allowed for certain combinations of modifiers, Bu sadece "Özel Korumalı" dan daha fazlası olduğu anlamına mı geliyor?
XaolingBao

@XaolingBao Tabii ki, bir erişimci hiçbir aksesuar gibi değil :) Sağlanan bağlantılar sorunuzu netleştirmelidir.
m0skit0

52

Kafa karıştırıcı / belirsiz hikayeler var:

Birincisi, Princeton kaynağından ve ayrıca MIT arşivlerinden şunu belirtiyor:

Not: Java dilinin 1.0 sürümü, beş erişim düzeyini destekledi: yukarıda listelenen dördü artı özel korumalı. Özel korumalı erişim düzeyi, 1.0'ın üzerindeki Java sürümlerinde desteklenmez; Java programlarınızda artık kullanmamalısınız.

Ancak bu özellik, burada veya burada Java 1.0 için herhangi bir resmi belgede belirtilmemiştir .

Tahminimce bu özellik resmi 1.0 sürümüne gelmedi, çünkü resmi dil spesifikasyonu Ağustos 1996'dan ve Princeton kaynağı en son Şubat 1996'da değiştirildi .

PS: eski sürümlerin arşivlerini kaldırmak için Oracle'a utanç.


bağlantım aynı içeriğin eski bir sürümü mü? : D

Belki de eksik bilginin koyduğunuz notla ilgisi vardır.

@AndrewLi Hiçbir yerde verilen referanslarda kararlı olarak ifade edilmez . Ve gerçek bir 1.0 olduğunda 1.0.2'yi 1.0 olarak belirtmek kesinlikle kafa karıştırıcıdır.
m0skit0

10

Sorunuzda belirttiğiniz bağlantı private protected, bir öğenin element/memberbirinde kullanıldığından subclass, öğeye erişebilmenizi ancak öğesinin içindeki diğer sınıflardan gizli kalmasını istediğinizde package.

Javaile karşılaştırıldığında C++ekstra bir kapsülleyici eleman kavramı vardır - ve bu bir Pakettir . Ayrıca , & Javagibi bu erişim belirteçleri söz konusu olduğunda bir paketin içinde veya dışında nelerin erişilebilir olduğunu da anlamalıdır .privatepublicprotected

Lütfen neden kullanıldığını açıkladığımı unutmayın. Elbette mevcut sürümünde değil


Bağlantım yöntem erişimi içindir. Üye erişimi değil.

1
@MarkYisri aynı şey üye değişkenleri için de kullanılabilir. erişim belirteçleri yalnızca yöntemlerde değil, üye değişkenlerde de çalışır. Başka bir deyişle, erişim belirteçleri bir kapsülleme kavramlarıdır ve üye yöntemlerine veya üye değişkenlerine uygulayıp uygulamadığınızdan bağımsızdır. C ++ ve java dahil olmak üzere neredeyse tüm nesne yönelimli diller için geçerlidir
programmer_of_the_galaxies

Tamam, ama öğretici (ilginç olarak) değişkenler üzerinde korunan özel bahsetmiyor. Bekle ve bir değişken sayfası olup olmadığını görmeme izin ver ...


0

Hayır, her iki kullanamazsınız privatebir protectedaraya. Eğiticiniz tuhaf. Ne var paket özel veya ot6 referanslarda paket korumalı erişim denir. Bu, açıkça acc6 niteleyicisi yazılmadığında etkinleştirilen varsayılan erişimdir.


3
Kullanamayacağının farkındaydım. Ne olduğunu bilmek istiyorum, diğer cevaplar daha iyi açıklıyor.

4
Bağlantı 1996'dan itibaren, Java gelişiminin yaklaşık bir yıl önce başlamış olması nedeniyle, bağlantının içeriği gerçekten garip değil: D
Keiwan

6
Dokümanın tarihi hakkında iyi bir nokta. Myou treni gelirken soruyu yanıtladı ve telefonla yazdım, cevap yeterince raydan çıkarılmamışsa çok üzgünüm. Sadece yardım etmek istedim ...
AlexR

6
@AlexR raydan çıkan yazım hatası aslında bir kelime oyunu (tren). Sadece fark ettim. : D

1
@MarkYisri, detaylı. Telefon kullanarak yazmak, SO'ya cevap göndermenin en iyi yolu değildir.
AlexR

-2

Özel kapsam mevcut sınıfa dayanmaktadır. Wherein Protected, diğer paketlerdeki sınıflar tarafından genişletilen paket ve sınıf içinde erişilebilir.

Değişkeninizin / yöntemlerinizin paketin dışına erişmesini istiyorsanız, korumalı / herkese açık olarak özel veya diğer bazı erişim belirteçleri olarak tanımlamanız gerekir.

Korunan yöntemlere genellikle dış paketten ve alt sınıflardan erişilebilir, yani bir sınıf ilgili sınıfı korunan tanımlı yöntemlerden yararlanarak genişletmelidir.

Özel yöntemlerin / değişkenlerin sınıf içinde kapsamı vardır, sınıf dışında erişilemezler.

Bu nedenle Özel Korumalı'yı aynı anda tanımlayamazsınız!


Bu soruya cevap vermedi. Neden işe yaramadığını sordum. Diğer cevaplar soruyu cevaplamaktan çok daha iyi bir iş çıkarır.

Daha fazla açıklığa kavuşturmak için, artık çalışmadığını biliyorum, ancak diğer cevaplar geçmişte neden ve ne olduğunu açıklıyor. Seninki değil.
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.