İç içe sınıflar - bir sınıfın içinde tanımlanan sınıflardır. Aşağıdaki türleri vardır:
Bir anonim sınıf örneği:
Button b = new Button(); b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // tıklama eylemi } });
Özellikler:
İç sınıf (non-static inner) statik yöntemler veya değişkenler içerebilir mi?
Cevap: Hayır, sadece sabitler (static final) içerebilir. Sadece statik iç sınıf (static nested class), static üyeleri barındırabilir.
Doğru kullanım şöyle olmalı:
class Outer { static class StaticNested { static int x = 10; // TAMAM } }
Hikaye
Bir Android uygulamasında iç sınıf bir olay işleyici olarak kullanıldı. İşleyici, static bir alanda saklandı ve Activity'e dolaylı bir referans tuttu, bu da yok olduğunda bellek sızıntısına neden oldu ve uygulama "sızmaya" başladı, hatta OutOfMemoryError'a kadar gitti.
Hikaye
Bir mikro hizmette, dıştaki değişkenleri referans alan anonim sınıflar kullanıldı. Sonrasında refaktörizasyon sırasında değişkenler etkili olarak final olmadı ve kod derlenmedi; geliştiriciler bu kısıtlamayı hatırlayana kadar uzun süre nedeni aradılar.
Hikaye
Bir kütüphanede iç sınıflar içinde statik değişkenler kullanıldı, bunun sıradan bir uygulama olduğunu düşündüler. Yeni JDK sürümlerinde proje derlenmeyi durdurdu çünkü standart, kısıtlamalara daha katı bir şekilde uyum sağlamaya başladı. Acil bir mimari yeniden çalışma gerekiyordu.