Java Inner Classes Nedir? Tüm Türleriyle Kapsamlı Rehber

Java’da inner classes (iç sınıflar), bir sınıfın içinde tanımlanan sınıflardır ve özellikle karmaşık yapılarda kodu organize etmek, olay işleyicileri yazmak ve belirli nesne ilişkilerini sıkı şekilde bağlamak için kullanılır. İç sınıflar Java’nın nesne yönelimli yapısını güçlendiren önemli bir özelliktir.

Bu yazıda regular inner class, method-local inner class, anonymous inner class ve static nested class olmak üzere tüm iç sınıf türlerini örneklerle ele alacağız.

Inner Class Nedir?

Bir inner class, başka bir sınıfın içinde tanımlanan sınıftır. Inner class, dış sınıfa (outer class) sıkı şekilde bağlıdır ve dış sınıfın private üyelerine bile tam erişim sağlar. Bu sayede iki sınıf arasında güçlü bir ilişki kurulması gerektiğinde ideal bir yapı sunar.

Özellikle GUI programlarında olay işleyicileri (event handlers) için yaygın olarak kullanılır. Örneğin bir butona basıldığında outer class içindeki bir metoda erişmek için inner class mükemmel çözümdür.

Inner Class’ın Avantajları

  • Outer class’ın private üyelerine direkt erişebilir.
  • Kodun okunabilirliğini ve kapsüllemeyi artırır.
  • Event handling gibi durumlarda sınıflar arası sıkı ilişki kurmayı kolaylaştırır.
  • Bir sınıfa özgü olup başka yerde kullanılmayacak yardımcı sınıfları saklamayı sağlar.

1. Regular (Normal) Inner Class

Regular inner class, bir sınıfın gövdesi içinde (ancak herhangi bir metodun dışında) tanımlanan iç sınıftır.


class MyOuter {
    private int x = 7;

    class MyInner {
        public void seeOuter() {
            System.out.println("Outer x is " + x);
        }
    }
}
  

Inner Class Oluşturma

Outer class içinden:


MyInner inner = new MyInner();
inner.seeOuter();
  

Outer class dışından:


MyOuter outer = new MyOuter();
MyOuter.MyInner inner = outer.new MyInner();
inner.seeOuter();
  

2. Method-Local Inner Class

Method-local inner class, bir metodun içinde tanımlanan sınıftır. Bu sınıflar yalnızca tanımlandıkları metodun içinde örneklenebilir.


class MyOuter2 {
    void doStuff() {
        class MyInner {
            public void seeOuter() {
                System.out.println("Inner class inside a method");
            }
        }
        MyInner mi = new MyInner();
        mi.seeOuter();
    }
}
  

Önemli Not:

Method-local inner class, metod içindeki local değişkenlere yalnızca final ise erişebilir. Bunun nedeni, metod sona erince local değişkenlerin yok olması ve inner class’ın hala yaşamaya devam edebilmesidir.

3. Anonymous Inner Class

Anonymous inner class, adı olmayan bir iç sınıftır. Genelde bir sınıfı hızlıca extend etmek veya bir interface’i anında implement etmek için kullanılır.

Sınıfı extend eden anonymous inner class:


Popcorn p = new Popcorn() {
    public void pop() {
        System.out.println("anonymous popcorn");
    }
};
  

Interface implement eden anonymous inner class:


Runnable r = new Runnable() {
    public void run() {
        System.out.println("running...");
    }
};
  

Bu sınıfların en sık kullanıldığı yerler arasında event handling ve thread oluşturma bulunur.

4. Static Nested Class

Static nested class teknik olarak inner class değildir. Outer class içinde static olarak tanımlanan bir sınıftır ve outer class’ın bir instance’ına bağlı değildir.


class BigOuter {
    static class Nested {
        void go() {
            System.out.println("hello");
        }
    }
}

BigOuter.Nested n = new BigOuter.Nested();
n.go();
  

Static nested class, outer class’ın instance değişkenlerine erişemez; sadece static üyelerine erişebilir.

Sonuç

Java inner classes, doğru kullanıldığında kodun daha düzenli, modüler ve güçlü olmasını sağlar. Regular inner classes, method-local inner classes, anonymous inner classes ve static nested classes gibi farklı yapılar sayesinde ihtiyaca göre farklı çözümler üretilebilir.

Özellikle event-driven mimariler, GUI uygulamaları ve belirli helper sınıfların sadece bir yere özgü olması gereken durumlarda inner classes mükemmel bir seçenektir.

Beğendiysen bir çay ısmarlayabilirsin ☕

Bana çay ısmarla

Java ile ilgili yorumlar

Yorum Paylaş

EMail Zorunlu alanlar * *