Sobes.tech
Middle

İç içə sinflər və onların hansı hallarda istifadə olunduğu haqqında danış.

sobes.tech Süni İntellekt

AI-dan cavab

Java-da Nested Classes (Daxil olan Sinflər) başqa sinifin içində müəyyən edilən sinflərdir. Onlar iki növə bölünür: statik (Static Nested Classes) və daxili sinflər (Inner Classes).

Statik daxili sinflər

  • static modifieri ilə elan edilir.
  • Yalnız xarici sinfin statik üzvlərinə (həmçinin gizlədilmiş olanlara) giriş imkanı verir.
  • Xarici sinfin qeyri-statik üzvlərinə giriş imkanı yoxdur.
  • Statik daxili sinfin nümunəsini yaratmaq üçün xarici sinfin nümunəsi tələb olunmur:
    // Xarici sinif
    class Outer {
        static int outerStaticField;
        int outerInstanceField;
    
        // Statik daxili sinif
        static class StaticNested {
            void accessOuter() {
                // Xarici sinfin statik sahəsinə giriş
                System.out.println(Outer.outerStaticField);
                // outerInstanceField-ə giriş yoxdur
                // System.out.println(outerInstanceField); // Kompilyasiya xətası
            }
        }
    }
    
    // Statik daxili sinifdən istifadə
    class Main {
        public static void main(String[] args) {
            Outer.StaticNested nestedObject = new Outer.StaticNested();
            nestedObject.accessOuter();
        }
    }
    

Daxili siniflər

  • static modifieri ilə elan edilmir.
  • Xarici sinfin bütün üzvlərinə (statik və qeyri-statik, hətta gizlədilmiş) tam giriş imkanı verir.
  • Daxili sinfin nümunəsi xarici sinfin nümunəsindən asılıdır.
  • Daxili sinfin nümunəsini yaratmaq üçün xarici sinfin nümunəsi lazımdır:
    // Xarici sinif
    class Outer {
        static int outerStaticField;
        int outerInstanceField;
    
        // Daxili sinif
        class Inner {
            void accessOuter() {
                // Xarici sinfin statik sahəsinə giriş
                System.out.println(Outer.outerStaticField);
                // Xarici sinfin qeyri-statik sahəsinə giriş
                System.out.println(outerInstanceField);
            }
        }
    }
    
    // Daxili sinifdən istifadə
    class Main {
        public static void main(String[] args) {
            Outer outerObject = new Outer();
            Outer.Inner innerObject = outerObject.new Inner();
            innerObject.accessOuter();
        }
    }
    

Daxili siniflər aşağıdakı kateqoriyalara bölünür:

  • Nizamlı daxili sinflər: Birbaşa xarici sinfin daxilində müəyyən edilir.
  • Yerli daxili sinflər: Metodlar, konstruktörlər və ya initsializasiya blokları daxilində müəyyən edilir və yalnız həmin blok daxilində görünür.
    class Outer {
        void display() {
            class LocalInner { // Yerli daxili sinf
                void message() {
                    System.out.println("Yerli daxili sinf");
                }
            }
            LocalInner obj = new LocalInner();
            obj.message();
        }
    }
    
  • Anonim daxili sinflər: Adı olmayan sinflərdir, sinif və ya interfeys nümunəsi yaratmaq və onların implementasiyasını dərhal təmin etmək üçün istifadə olunur. Çox vaxt hadisə dinləyiciləri ilə istifadə olunur.
    interface Greeting {
        void sayHello();
    }
    
    class Main {
        public static void main(String[] args) {
            Greeting greeting = new Greeting() { // Adı olmayan daxili sinif
                @Override
                public void sayHello() {
                    System.out.println("Salam!");
                }
            };
            greeting.sayHello();
        }
    }
    

Daxili sinflər nə zaman tətbiq olunur:

  • Məntiqi qruplaşdırma: Əgər sinif yalnız başqa bir sinfin bir hissəsidirsə və onları birlikdə qruplaşdırmaq məntiqlidirsə. Bu, kodun oxunaqlığını və saxlanmasını yaxşılaşdırır.
  • Encapsulation: Daxili sinflər xarici sinfin üzvlərinə giriş imkanı verə bilər, bu da daha sıx əlaqə və implementasiya detallərinin gizlədilməsini təmin edir.
  • Daha oxunaqlı kod: Kiçik və sadə sinif yalnız bir yerdə istifadə olunursa, onun daxil edilməsi kodu daha təmiz edə bilər.
  • Resursların səmərəli istifadəsi: Daxili sinflər xarici sinfin üzvlərinə giriş imkanı verir, bu da kodu sadələşdirə bilər. Məsələn, iteratorların həyata keçirilməsi.
  • İnterfeys və ya siniflərin genişləndirilməsi kontekstində: Anonim daxili sinflər tez-tez interfeys və ya abstrakt sinflərin qısa həyata keçirilməsini "canlı" təmin etmək üçün istifadə olunur.
  • Həllərin gizlədilməsi: Bir sinfi başqa sinif daxilində gizlətmək, onu xaricdən görünməz etmək.

Statik və daxili sinflərin müqayisəsi:

Parametr Statik daxili sinif Daxili sinif
static modifieri Bəli Xeyr
Xarici sinfin üzvlərinə giriş Yalnız statik (hətta private) Bütün üzvlər (statik və qeyri-statik, private)
Yaratmaq üçün xarici sinfin nümunəsi tələb olunur Xeyr Bəli
Xarici sinif nümunəsi ilə əlaqə Xeyr Bəli

Seçim, daxili sinfin xarici sinfinin qeyri-statik üzvlərinə ehtiyacı olub-olmamasına bağlıdır. Əgər ehtiyac varsa, daxili sinfi istifadə edin. Əks halda, statik daxili sinf daha uyğundur, çünki o, xarici sinfin nümunəsinə bağlı deyil və daha səmərəli ola bilər.