ProgramlamaBackend geliştirici

Java'daki iç içe sınıfların (static ve non-static) nasıl çalıştığını, her birinin ne zaman kullanılacağını ve uygulanmasıyla ilgili hangi tuzakların bulunduğunu açıklayın.

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

Cevap.

Java'da dört tür iç içe sınıf bulunmaktadır:

  • Statik iç sınıflar (static nested class);
  • İç sınıflar (inner class, non-static);
  • Yerel sınıflar (local class, metodlar içinde tanımlanır);
  • Anonim iç sınıflar.

Static nested class, dış sınıfın non-static üyelerine doğrudan erişime sahip değildir. Ayrı bir sınıf olarak derlenir ve örnekleri dış sınıf nesnesine gizli bir referans tutmaz.

Inner class (non-static) dış nesneye dolaylı bir referans tutar ve onun alanlarına erişebilir. Bu tür sınıflar genellikle dış nesneye erişim sağlayabilen dinleyiciler veya iterator'lar uygulamak için kullanılır.

class Outer { static class Nested { // static void foo() {} } class Inner { // non-static void bar() { System.out.println(value); // dış sınıfın alanına erişim } } int value = 42; }

Dış sınıfın durumuna erişim gerektirmeyen, ancak dış sınıfla anlam açısından bağlantılı olan yardımcı veya yardımcı yapılar için static nested class kullanın. Dış sınıfın non-static üyelerine doğrudan erişim gerektiğinde daha yakın bir entegrasyon için inner class kullanın.

Tuzaklı Soru.

Soru: "Static nested class, dış sınıfın bir örneğinin non-static alanlarına doğrudan erişebilir mi?"

Cevap: Hayır, static nested class doğrudan dış sınıfın bir örneğinin non-static alanlarına veya metodlarına erişemez, çünkü dış sınıf nesnesine referans tutmaz (veya içermez).

Konuyla ilgili unutkanlıkların neden olduğu gerçek hata örnekleri.


Hikaye

Veri depolamak için bir önbellek kütüphanesinde static nested class kullanıldı, dış sınıfın yapılandırma ayarlarına erişim beklendi. Erişim denemesi sırasında bir derleme hatası meydana geldi — iç sınıf non-static alanları göremedi, bu nedenle mimari değiştirildi.


Hikaye

Grafik uygulaması arayüzünde, sabitler için inner class yerine static nested class kullanıldı, bu nedenle dış nesneye gereksiz bir dolaylı referans oluştu. Sonuç olarak, çöp toplayıcı belleği düzgün bir şekilde temizleyemedi ve bellek sızıntılarına yol açtı.


Hikaye

İç içe sınıflar içeren bir koleksiyonu serileştirirken bir sorun ortaya çıktı: inner class, üst nesneye referans tutuyor ve serileştirme sırasında tüm bağımlılık ağacının serileştirilmesine neden oluyordu, bu da süreci yavaşlatıyordu ve sonuç boyutunu artırıyordu. Static nested class'a geçiş yapıldığında sorun çözüldü.