Sobes.tech
Middle

Pasakok apie vidines klases ir kada jos taikomos.

sobes.tech AI

Atsakymas iš AI

Java viduje įdėti klasės (Nested Classes) yra klasės, apibrėžtos kitoje klasėje. Jie skirstomi į du tipus: statines (Static Nested Classes) ir vidines (Inner Classes):

Statinės vidinės klasės

  • Apibrėžiamos su static modifikatoriumi.
  • Turi prieigą tik prie išorinio klasės statinių narių (net jei jie yra paslėpti).
  • Neturi prieigos prie išorinio klasės nestatinių narių.
  • Norint sukurti statinės vidinės klasės egzempliorių, nereikia išorinio klasės egzemplioriaus:
    // Išorinis klasė
    class Outer {
        static int outerStaticField;
        int outerInstanceField;
    
        // Statinė vidinė klasė
        static class StaticNested {
            void accessOuter() {
                // Prieiga prie išorinio klasės statinio lauko
                System.out.println(Outer.outerStaticField);
                // Prieiga prie išorinio klasės nestatinio lauko nėra įmanoma
                // System.out.println(outerInstanceField); // Kompiliatoriaus klaida
            }
        }
    }
    
    // Statinės vidinės klasės naudojimas
    class Main {
        public static void main(String[] args) {
            Outer.StaticNested nestedObject = new Outer.StaticNested();
            nestedObject.accessOuter();
        }
    }
    

Vidinės klasės

  • Nėra static modifikatoriaus.
  • Turi pilną prieigą prie visų išorinio klasės narių (statinių ir nestatinių, net jei jie yra paslėpti).
  • Išorinio klasės egzemplioriaus be egzemplioriaus negali egzistuoti.
  • Norint sukurti išorinio klasės egzemplioriaus, reikia egzemplioriaus:
    // Išorinis klasė
    class Outer {
        static int outerStaticField;
        int outerInstanceField;
    
        // Vidinė klasė
        class Inner {
            void accessOuter() {
                // Prieiga prie išorinio klasės statinio lauko
                System.out.println(Outer.outerStaticField);
                // Prieiga prie išorinio klasės nestatinio lauko
                System.out.println(outerInstanceField);
            }
        }
    }
    
    // Vidinės klasės naudojimas
    class Main {
        public static void main(String[] args) {
            Outer outerObject = new Outer();
            Outer.Inner innerObject = outerObject.new Inner();
            innerObject.accessOuter();
        }
    }
    

Vidinės klasės skirstomos į:

  • Tiesioginės vidinės klasės: apibrėžtos išorinio klasės kūne.
  • Vietinės vidinės klasės: apibrėžtos metodų, konstruktorių ar inicializacijos blokų viduje ir matomos tik šiame bloke.
    class Outer {
        void display() {
            class LocalInner { // Vietinė vidinė klasė
                void message() {
                    System.out.println("Vietinė vidinė klasė");
                }
            }
            LocalInner obj = new LocalInner();
            obj.message();
        }
    }
    
  • Bevardės vidinės klasės: be pavadinimo, naudojamos kurti egzempliorių ar įgyvendinti sąsajas ir iš karto pateikti jų realizaciją. Dažnai naudojamos įvykių klausytojams (event listeners):
    interface Greeting {
        void sayHello();
    }
    
    class Main {
        public static void main(String[] args) {
            Greeting greeting = new Greeting() { // Bevardė vidinė klasė
                @Override
                public void sayHello() {
                    System.out.println("Labas!");
                }
            };
            greeting.sayHello();
        }
    }
    

Kur taikyti vidines klasės:

  • Loginė grupavimas: Jei klasė yra tik kitos klasės dalis ir turi prasmę būti grupuojama kartu. Tai pagerina kodo skaitomumą ir palaikymą.
  • Inkapuliacija: Vidinės klasės gali turėti prieigą prie išorinio klasės narių, užtikrinant glaudesnį ryšį ir galimybę paslėpti įgyvendinimo detales.
  • Geriau skaitomas kodas: Kai mažas, paprastas klasė naudojama tik vienoje vietoje, jos įdėjimas gali padaryti kodą tvarkingesnį.
  • Resursų efektyvus naudojimas: Vidinės klasės turi prieigą prie išorinio klasės narių be jų aiškaus perdavimo, kas gali supaprastinti kodą. Pavyzdžiui, iteratorių įgyvendinimas.
  • Interfeisų įgyvendinimas ar klasių išplėtimas kontekste: Bevardės vidinės klasės dažnai naudojamos patogiai įgyvendinti interfeisus ar abstrakčias klases "gyvai".
  • Įgyvendinimo paslėpimas: Klasės paslėpimas išorinioje klasėje, padarant ją nematomą išorėje.

Palyginimas tarp statinių ir vidinių klasių:

Parametras Statinė vidinė klasė Vidinė klasė
static modifikatorius Taip Ne
Prieiga prie išorinio klasės narių Tik statiniai (net jei paslėpti) Visos nariai (statiniai ir nestatininiai, paslėpti)
Reikia išorinio klasės egzemplioriaus kurti Ne Taip
Ryšys su išorinio klasės egzemplioriumi Ne Taip

Pasirinkimas tarp statinės vidinės ir vidinės klasės priklauso nuo to, ar vidinė klasė turi prieigą prie nestatinių išorinio klasės narių. Jei turi, naudokite vidinę klasę. Jei ne, statinė vidinė klasė yra tinkamesnė, nes ji nėra susieta su išorinio klasės egzemplioriumi ir gali būti efektyvesnė.