9 Aralık 2020

Nested Class

ile gökhan

Nested class (iç içe geçmiş sınıf) başka bir sınıf içerisinde tanımlanan bir sınıftır.

Nested class, tek bir yerde kullanılan sınıfları mantıksal olarak gruplamaya yarar. Bir sınıf yalnızca diğer sınıf için kullanışlıysa, sınıfı diğer sınıf içerisine yerleştirmek mantıklıdır.

Kapsüllemeyi artırır. Örneğin A ve B isimli iki sınıfımız olsun. B sınıfını A sınıfı içerisinde saklayarak, A sınıfının private üyeleri olabilir ve B sınıfı bunlara erişebilir. B sınıfının kendisi diğer sınıflardan gizlenebilir.

Kod okunabilirliğini arttırır. Daha kolay okunabilir ve bakımı daha kolay kod blokları oluşturulabilir.

Nested class 4 türden oluşur: Inner class, static nested class, local class, anonymous class.

Inner Class

Inner class, bir sınıfın üye düzeyinde tanımlanan static olmayan bir türdür. ( Metodlar, constructori instance variable ile aynı düzey). Inner class özellikleri aşağıdaki gibidir:

  • public, private, protected olabilirler.
  • Herhangi bir sınıfı extend edebilirler ve interface uygulayabilirler.
  • Abstract veya final olarak işaretlenebilirler.
  • static final dışında static değişken veya yöntemler bildirilemez.
  • private değişkenler dahil dış sınıfın tüm üyelerine erişebilirler.

Aşağıda bir inner class örneği verilmiştir. Burada 3 adet iç içe geçmiş sınıf görülmektedir. Her bir sınıfın aynı isimde x adlı instance değişkeni bulunmaktadır. Bu x değerlerinin çağrılması aşağıdaki gibidir. B ve C sınıfında x değişkenlerini çağırabilmek için A sınıfından bir nesnenin oluşturulmalı ve bu nesne yardımıyla diğer sınıflara erişim mümkün olmaktadır.

public class A {
    private int x = 10;
    class B {
        private int x = 20;
        class C {
            private int x = 30;

            public void allTheX() {
                System.out.println(x);
                System.out.println(this.x);
                System.out.println(B.this.x);
                System.out.println(A.this.x);
            }
        }
    }
    public static void main(String[] args) {
        A a = new A();
        A.B b = a.new B();
        A.B.C c = b.new C();
        c.allTheX();
    }
}

Bir sonraki nested class türümüz olan static inner class için sonraki bölümü inceleyebilirsiniz.