ProgramlamaJava Geliştirici

Java'da sınıf üyelerinin görünürlüğünü (erişim kontrolü) yönetmek için hangi mekanizmalar vardır, bunları nasıl doğru bir şekilde uygulamalıyız ve mimarimizi tasarlarken hangi detaylara dikkat etmeliyiz?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Java'da alanlara, yöntemlere ve sınıflara erişimi yönetmek için erişim belirteçleri kullanılır: private, default (paket-özel), protected, public.

Konuya Giriş:

Java'nın erken sürümleri sıkı nesne kapsüllemeyi kullanıyordu. Esneklik için tam kapama ve genişletilebilirliğe (miras ve paket içindeki erişim) destek olmak amacıyla farklı erişim seviyeleri getirildi.

Problem:

Yanlış erişim belirteci seçimi, kapsüllemeyi ihlal edebilir, miras alma sorunlarına, test etme imkânsızlığına veya verilerin hatayla herkese açık hale gelmesiyle güvenlik hatalarına yol açabilir.

Çözüm:

Mimarinize en kapalı erişim belirtecini kullanın. Alanlar genellikle private olarak tanımlanır ve bunlara getter/setter aracılığıyla erişim sağlanır. Yöntemler, yalnızca API'nin bir parçası olduklarında public yapılır, genişletme için ise protected olurlar.

Kod örneği:

public class Person { private String name; // kapalı alan protected int age; // pakette ve miras alınanlarda erişilebilir String email; // paket-özel public String getName() { return name; } }

Ana özellikler:

  • private — sadece sınıf içinde erişilebilir
  • paket-özel (belirteç olmadan) — aynı paketteki tüm sınıflardan erişim
  • protected — diğer paketlerdeki miras alanlara da erişim sağlar
  • public — herkes tarafından erişilebilir

Cevaplaması zor sorular.

Yerel değişkenlere erişim belirteci uygulanabilir mi?

Hayır. Erişim belirteçleri yalnızca sınıflara, yöntemlere ve alanlara/iç içe sınıflara uygulanır, yerel değişkenlere değil.

Bir yöntemin içinde, public erişim belirteci ile sınıf oluşturulabilir mi?

Hayır. Yerel bir sınıf erişim belirtecine sahip olarak tanımlanamaz, her zaman yöntemin içindeki alan kapsamına sahiptir.

Protected üye, başka bir paketteki alt sınıfa erişilebilir mi?

Evet, protected üyeler, başka paketlerde bulunsalar bile miras alanlara erişebilir, ancak başka bir paketteki normal sınıflara değil.

Yaygın hatalar ve anti-paterni

  • Public alanların kullanımı (kapsüllemeyi ihlal etme)
  • "Rastgele" paket-özel (unutulmuş belirteç)
  • Gereksiz yere protected yöntemlerin aşırı açılması
  • Uygulamanın bölümleri arasında bilgi transferi için public static alanların kötüye kullanılması

Gerçek hayattan örnek

Olumsuz örnek

Sınıfın tüm alanları yanlışlıkla public olarak tanımlanmış — diğer sınıflardan doğrudan erişiliyor, değişiklik yerlerini izlemek zorlaşıyor.

Artılar:

  • Verilere hızlı ve kolay erişim

Eksiler:

  • Erişim kontrolünü sağlamanın zorluğu. Kontrol/validasyon mantığı yok
  • Verileri bozma olasılığı yüksek

Olumlu örnek

Tüm alanlar private, ve halka açık yöntemler erişimi kontrol ediyor ve sadece gerekli kısımlar miras alımlarda genişletme için protected yapılıyor.

Artılar:

  • Güvenlik, kontrol, öngörülebilirlik
  • Mimarlığın esnekliği

Eksiler:

  • Ek yöntemler (getter/setter) gereklidir
  • Hızlı prototiplemede etkileşim karmaşıklaşır