protected erişim belirleyicisi, sınıf üyelerinin aynı paket içinde ve diğer paketlerdeki alt sınıflar içinde görünür olmasını sağlar.
Diğer belirleyicilerle farklılıklar:
private — sadece mevcut sınıf içinde erişimprotected — mevcut paket içinde ve paket dışında miras alınan sınıflara erişimpublic — her yerde erişimÖrnek:
package com.example.base; public class Parent { protected void sayHello() { System.out.println("Hello from parent"); } } package com.example.child; import com.example.base.Parent; public class Child extends Parent { public void tryHello() { sayHello(); // Erişim var! } } public class NotChild { public void fail(Parent p) { // p.sayHello(); // Hata: erişim yok } }
Dış sınıf (miras alan sınıf değil) başka bir paketteki
protectedmetoda, bu sınıfın nesnesine sahip olarak erişebilir mi?
Cevap: Hayır, başka bir paketteki protected metoda erişim sadece miras alan sınıflara izin verilir ve yalnızca this veya miras alan nesnenin referansı üzerinden yapılabilir, ana sınıf referansı ile değil.
Parent p = new Child(); p.sayHello(); // Hata! ((Child) p).sayHello(); // Başarılı (eğer Child içinde erişiliyorsa)
Hikaye
Büyük bir modüler projede, bir geliştirici önemli iş yöntemlerini
protectedbölümüne yerleştirdi, ve bunun dış pakette erişilemeyeceğini düşündü. Diğer geliştiriciler bu yöntemleri aynı pakette testlerinde yanlışlıkla kullandılar ve sınıfların daha sonra taşınması sonucu beklenmedik erişim hataları oluştu.
Hikaye
Mikroservisler projesinde,
protectederişime sahip bir metod, başka bir pakette ana tür referansı üzerinden çağrılmaya çalışıldı — çağrı çalışmadı. Bu, sistemin genişletme mekanizmalarının bir kısmında sorun yarattı, çünkü erişim alanının yanlış anlaşılmasına dayanıyordu.
Hikaye
Açık kaynak kütüphanede korumalı alanlar dikkatle kullanılmadı, bu da çok geniş bir sınıf yelpazesine erişim sağladı, bu da nesnenin iç durumunu isteyerek bozarak üçüncü taraf uygulamalarında sorunlara yol açtı.