Sobes.tech
Middle

Pastāsti par iekšējām klasēm un kādos gadījumos tās tiek izmantotas.

sobes.tech AI

Atbilde no AI

Java iekšējās klases (Nested Classes) ir klases, kas definētas citas klases iekšpusē. Tās iedala divos veidos: statiskās (Static Nested Classes) un iekšējās (Inner Classes):

Statiskās iekšējās klases

  • Tiek deklarētas ar static modifikatoru.
  • Tām ir piekļuve tikai ārējās klases statiskajiem locekļiem (pat ja tie ir slēpti).
  • Tām nav piekļuves ārējās klases nestatiskajiem locekļiem.
  • Lai izveidotu statiskās iekšējās klases instanci, nav nepieciešama ārējās klases instance:
    // Ārējā klase
    class Outer {
        static int outerStaticField;
        int outerInstanceField;
    
        // Statiskā iekšējā klase
        static class StaticNested {
            void accessOuter() {
                // Pieeja ārējās klases statiskajam laukam
                System.out.println(Outer.outerStaticField);
                // Pieeja ārējās klases nestatiskajam laukam nav iespējama
                // System.out.println(outerInstanceField); // Kompilācijas kļūda
            }
        }
    }
    
    // Statiskās iekšējās klases izmantošana
    class Main {
        public static void main(String[] args) {
            Outer.StaticNested nestedObject = new Outer.StaticNested();
            nestedObject.accessOuter();
        }
    }
    

Iekšējās klases

  • Nav static modifikatora.
  • Tām ir pilna piekļuve visiem ārējās klases locekļiem (statiskajiem un nestatiskajiem, pat ja tie ir slēpti).
  • Iekšējās klases instances nevar pastāvēt bez ārējās klases instances.
  • Lai izveidotu iekšējās klases instanci, nepieciešams ārējās klases instances:
    // Ārējā klase
    class Outer {
        static int outerStaticField;
        int outerInstanceField;
    
        // Iekšējā klase
        class Inner {
            void accessOuter() {
                // Pieeja ārējās klases statiskajam laukam
                System.out.println(Outer.outerStaticField);
                // Pieeja ārējās klases nestatiskajam laukam
                System.out.println(outerInstanceField);
            }
        }
    }
    
    // Iekšējās klases izmantošana
    class Main {
        public static void main(String[] args) {
            Outer outerObject = new Outer();
            Outer.Inner innerObject = outerObject.new Inner();
            innerObject.accessOuter();
        }
    }
    

Iekšējās klases iedala:

  • Tiešās iekšējās klases: definētas ārējās klases ķermenī.
  • Vietējās iekšējās klases: definētas metožu, konstruktoru vai inicializācijas bloku iekšienē un ir redzamas tikai šajā blokā.
    class Outer {
        void display() {
            class LocalInner { // Vietējā iekšējā klase
                void message() {
                    System.out.println("Vietējā iekšējā klase");
                }
            }
            LocalInner obj = new LocalInner();
            obj.message();
        }
    }
    
  • Anonīmās iekšējās klases: klases bez nosaukuma, kas tiek izmantotas instances izveidei vai interfeisa realizācijai un nekavējoties nodrošina to realizāciju. Bieži tiek izmantotas notikumu klausītāju (event listeners) izveidei:
    interface Greeting {
        void sayHello();
    }
    
    class Main {
        public static void main(String[] args) {
            Greeting greeting = new Greeting() { // Anonīma iekšējā klase
                @Override
                public void sayHello() {
                    System.out.println("Sveiki!");
                }
            };
            greeting.sayHello();
        }
    }
    

Kad tiek izmantotas iekšējās klases:

  • Loģiska grupēšana: ja klase ir tikai citas klases daļa un ir jēga to kopā grupēt. Tas uzlabo koda lasāmību un uzturēšanu.
  • Inkapulācija: iekšējās klases var piekļūt ārējās klases locekļiem, nodrošinot ciešāku saistību un iespēju slēpt realizācijas detaļas.
  • Labāka koda lasāmība: ja mazs, vienkāršs klases tiek izmantots tikai vienā vietā, tā iekļaušana var padarīt kodu sakārtotāku.
  • Resursu efektīva izmantošana: iekšējās klases piekļūst ārējās klases locekļiem bez to skaidras nodošanas, kas var vienkāršot kodu. Piemēram, iteratoru realizācija.
  • Interfeisu realizācija vai klases paplašināšana kontekstā: anonīmas iekšējās klases bieži tiek izmantotas, lai nodrošinātu kompakti interfeisu vai abstraktu klases realizāciju "uz vietas".
  • Realizācijas slēpšana: klases slēpšana ārējā klasē, padarot to neredzamu ārpusē.

Salīdzinājums starp statiskajām un iekšējām klasēm:

Parametrs Statiskā iekšējā klase Iekšējā klase
static modifikators
Pieeja ārējās klases locekļiem Tikai statiskie (pat ja paslēpti) Visas (statiskās un nestatiskās, paslēptas)
Nepieciešams ārējās klases instances, lai to izveidotu
Saistība ar ārējās klases instanci

Izvēle starp statisko iekšējo klasi un iekšējo klasi ir atkarīga no tā, vai iekšējā klasei ir nepieciešama pieeja nestatiskajiem ārējās klases locekļiem. Ja jā, izmantojiet iekšējo klasi. Ja nē, tad labāk ir statiskā iekšējā klase, jo tā nav saistīta ar ārējās klases instanci un var būt efektīvāka.