Sobes.tech
Middle

Խոսեք ներքին դասարանների մասին և երբ են կիրառվում։

sobes.tech AI

Պատասխան AI-ից

Java-յի Նեստինգ դասերը (Nested Classes) այն դասերն են, որոնք սահմանված են մյուս դասի ներսում։ Դրանք բաժանվում են երկու տեսակի՝ ստատիկ (Static Nested Classes) և ներքին դասեր (Inner Classes):

Ստատիկ նեստինգ դասեր

  • Դրանք հայտարարում են static մոդիֆիկատորով:
  • ունեն միայն արտաքին դասի ստատիկ անդամների հասանելիություն (նույնիսկ թաքնված)
  • չունեն հասանելիություն արտաքին դասի ոչ-ստատիկ անդամներին
  • ստատիկ նեստինգ դասի օրինակ ստեղծելու համար անհրաժեշտ չէ արտաքին դասի օրինակ:
    // Արտաքին դաս
    class Outer {
        static int outerStaticField;
        int outerInstanceField;
    
        // Ստատիկ նեստինգ դաս
        static class StaticNested {
            void accessOuter() {
                // Ասած արտաքին դասի ստատիկ դաշտին
                System.out.println(Outer.outerStaticField);
                // Չի կարող հասանելի լինել outerInstanceField-ին
                // System.out.println(outerInstanceField); // Կոմպիլյատորային սխալ
            }
        }
    }
    
    // Ստատիկ նեստինգ դասի օգտագործում
    class Main {
        public static void main(String[] args) {
            Outer.StaticNested nestedObject = new Outer.StaticNested();
            nestedObject.accessOuter();
        }
    }
    

Ներքին դասեր

  • Դրանք հայտարարում են առանց static մոդիֆիկատորի
  • ունեն լիարժեք հասանելիություն արտաքին դասի բոլոր անդամներին (ստատիկ և ոչ-ստատիկ, նույնիսկ թաքնված)
  • ներքին դասի օրինակ գոյություն չունի առանց արտաքին դասի օրինակ
  • արտաքին դասի օրինակով կարելի է ստեղծել ներքին դասի օրինակ՝
    // Արտաքին դաս
    class Outer {
        static int outerStaticField;
        int outerInstanceField;
    
        // Ներքին դաս
        class Inner {
            void accessOuter() {
                // Ասած արտաքին դասի ստատիկ դաշտին
                System.out.println(Outer.outerStaticField);
                // Ասած արտաքին դասի ոչ-ստատիկ դաշտին
                System.out.println(outerInstanceField);
            }
        }
    }
    
    // Ներքին դասի օգտագործում
    class Main {
        public static void main(String[] args) {
            Outer outerObject = new Outer();
            Outer.Inner innerObject = outerObject.new Inner();
            innerObject.accessOuter();
        }
    }
    

Ներքին դասերը բաժանվում են՝

  • Նորմալ ներքին դասեր: Դրանք սահմանված են արտաքին դասի մարմնում
  • Տեղական ներքին դասեր: Դրանք սահմանված են մեթոդների, կոնստրուկտորների կամ ինիցիալիզացիոն բլոկների ներսում և տեսանելի են միայն այդ բլոկի սահմաններում
    class Outer {
        void display() {
            class LocalInner { // Տեղական ներքին դաս
                void message() {
                    System.out.println("Տեղական ներքին դաս");
                }
            }
            LocalInner obj = new LocalInner();
            obj.message();
        }
    }
    
  • Անանուն ներքին դասեր: Դրանք անվան չունեցող դասեր, որոնք օգտագործվում են օրինակ ստեղծելու կամ ինտերֆեյսի իրականացման համար և անմիջապես տրամադրում են իրենց իրականացմանը։ Սովորաբար օգտագործվում են իրադարձությունների լսիչների (event listeners) հետ:
    interface Greeting {
        void sayHello();
    }
    
    class Main {
        public static void main(String[] args) {
            Greeting greeting = new Greeting() { // Անանուն ներքին դաս
                @Override
                public void sayHello() {
                    System.out.println("Բարև!");
                }
            };
            greeting.sayHello();
        }
    }
    

Երբ կիրառվում են նեստինգ դասեր:

  • ** տրամաբանական խմբավորումներ:** Եթե դասը միայն արտաքին դասի մաս է և ունի իմաստ խմբավորելու նրանց միասին։ Սա բարելավում է կոդի ընթեռնելիությունը և սպասարկումը
  • Ապակասեցում: Ներքին դասերը կարող են մուտք ունենալ արտաքին դասի անդամներին, ինչը ապահովում է ավելի սերտ կապ և հնարավոր է թաքցնել իրականացման մանրամասները
  • Կոդի ավելի լավ ընթեռնելիություն: Երբ փոքր, պարզ դասը օգտագործվում է միայն մեկ տեղում, նրա ներգրավումը կարող է դարձնել կոդը ավելի մաքուր
  • Ռեսուրսների արդյունավետ օգտագործում: Ներքին դասերը ունեն մուտք արտաքին դասի անդամներին առանց նրանց հստակ փոխանցման, ինչը կարող է պարզեցնել կոդը։ Օրինակ՝ ինտերատորների իրականացման ժամանակ
  • Ինտերֆեյսների իրականացման կամ դասերի ընդլայնման համար: Անանուն ներքին դասերը հաճախ օգտագործվում են ինտերֆեյսների կամ աբստրակտ դասերի կոմպակտ իրականացման համար "լայն"։
  • Իմիտացիայի թաքցում: Դասի թաքցնում արտաքին դասի ներսում՝ դարձնելով այն անհայտ դուրսից:

Ստատիկ նեստինգ և ներքին դասերի համեմատություն:

Պարամետր Ստատիկ նեստինգ դաս Ներքին դաս
Մոդիֆիկատ static Այո Ոչ
Հասանելիություն արտաքին դասի անդամներին Միայն ստատիկ (նույնիսկ private) Բոլոր անդամներ (ստատիկ և ոչ-ստատիկ, private)
Արտաքին դասի օրինակով ստեղծելու անհրաժեշտություն Ոչ Այո
Կապ արտաքին դասի օրինակին Ոչ Այո

Ընտրությունը՝ ստատիկ նեստինգ դաս կամ ներքին դաս, կախված է նրանից՝ արդյոք նեստինգ դասը պետք է հասանելի լինի ոչ-ստատիկ անդամներին։ Եթե պետք է, օգտագործեք ներքին դասը։ Եթե ոչ, ստատիկ նեստինգ դասը ավելի հարմար է, քանի որ այն կապված չէ արտաքին դասի օրինակին և կարող է լինել ավելի արդյունավետ։