Sobes.tech
Middle

Реци о унутрашњим класама и у којим случајевима се користе.

sobes.tech АИ

Одговор од АИ

Ugnježdeni klasovi (Nested Classes) u Javi su klase definisane unutar druge klase. Deluju na dva načina: statički (Static Nested Classes) i unutrašnji (Inner Classes).

Statički ugnježdeni klasovi

  • Deklarišu se sa modifikatorom static.
  • Imaju pristup samo statičkim članovima spoljašnje klase (uključujući i skrivene).
  • Nemaju pristup nestatičkim članovima spoljašnje klase.
  • Za kreiranje instance statičkog ugnježdenog klasaa nije potrebna instanca spoljašnje klase:
    // Spoljašnja klasa
    class Outer {
        static int outerStaticField;
        int outerInstanceField;
    
        // Statički ugnježdeni klas
        static class StaticNested {
            void accessOuter() {
                // Pristup statičkom polju spoljašnje klase
                System.out.println(Outer.outerStaticField);
                // Nije moguće pristupiti outerInstanceField
                // System.out.println(outerInstanceField); // Greška pri kompajliranju
            }
        }
    }
    
    // Korišćenje statičkog ugnježdenog klas
    class Main {
        public static void main(String[] args) {
            Outer.StaticNested nestedObject = new Outer.StaticNested();
            nestedObject.accessOuter();
        }
    }
    

Unutrašnji klasovi

  • Nisu deklarisani sa static.
  • Imaju pun pristup svim članovima spoljašnje klase (statičkim i nestatičkim, uključujući i skrivene).
  • Instanca unutrašnjeg klasaa ne može postojati bez instance spoljašnje klase.
  • Za kreiranje instance unutrašnjeg klasaa je potrebna instanca spoljašnje klase:
    // Spoljašnja klasa
    class Outer {
        static int outerStaticField;
        int outerInstanceField;
    
        // Unutrašnji klas
        class Inner {
            void accessOuter() {
                // Pristup statičkom polju spoljašnje klase
                System.out.println(Outer.outerStaticField);
                // Pristup nestatičkom polju spoljašnje klase
                System.out.println(outerInstanceField);
            }
        }
    }
    
    // Korišćenje unutrašnjeg klasaa
    class Main {
        public static void main(String[] args) {
            Outer outerObject = new Outer();
            Outer.Inner innerObject = outerObject.new Inner();
            innerObject.accessOuter();
        }
    }
    

Unutrašnji klasovi se dele na:

  • Redovne unutrašnje klasove: Definišu se direktno unutar tela spoljašnje klase.
  • Lokalne unutrašnje klasove: Definišu se unutar metoda, konstruktora ili inicijalizacionih blokova. Vidljive su samo unutar tog bloka.
    class Outer {
        void display() {
            class LocalInner { // Lokalni unutrašnji klas
                void message() {
                    System.out.println("Lokalni unutrašnji klas");
                }
            }
            LocalInner obj = new LocalInner();
            obj.message();
        }
    }
    
  • Nema imena unutrašnje klasove: anonimni klasovi bez imena, koriste se za kreiranje instance klase ili interfejsa i odmah im se pruža implementacija. Često se koriste sa slušačima događaja (event listeners).
    interface Greeting {
        void sayHello();
    }
    
    class Main {
        public static void main(String[] args) {
            Greeting greeting = new Greeting() { // Anonimni unutrašnji klas
                @Override
                public void sayHello() {
                    System.out.println("Zdravo!");
                }
            };
            greeting.sayHello();
        }
    }
    

Kada se koriste ugnježdeni klasovi:

  • Logičko grupisanje: Ako je klasa deo samo druge klase i ima smisla da budu grupisane zajedno. To povećava čitljivost i održivost koda.
  • Enkapsulacija: Ugnježdeni klasovi mogu imati pristup članovima spoljašnje klase, što obezbeđuje jaču vezu i mogućnost skrivanja detalja implementacije.
  • Bolja čitljivost koda: Kada je mala, jednostavna klasa korišćena samo na jednom mestu, njeno ugnježđavanje može učiniti kod preglednijim.
  • Efikasno korišćenje resursa: Unutrašnji klasovi imaju pristup članovima spoljašnje klase bez potrebe za eksplicitnim prosleđivanjem, što može pojednostaviti kod. Na primer, za implementaciju iteratora.
  • Implementacija interfejsa ili proširenje klasa u kontekstu: Anonimni unutrašnji klasovi često se koriste za pružanje kompaktne implementacije interfejsa ili apstraktnih klasa "na licu mesta".
  • Skrivanje implementacije: Skrivanje klase unutar druge klase, čineći je nevidljivom spolja.

Uporedjenje statičkih ugnježdenih i unutrašnjih klasova:

Parametar Statički ugnježdeni klas Unutrašnji klas
Modifikator static Da Ne
Pristup članovima spoljašnje klase Samo statički (uključujući i privatne) Sve članove (statičke i nestatičke, uključujući privatne)
Potreba za instancom spoljašnje klase za kreiranje Ne Da
Veza sa instancom spoljašnje klase Ne Da

Izbor između statičkog ugnježdenog i unutrašnjeg klasaa zavisi od toga da li ugnježdeni klas treba pristup nestatičkim članovima spoljašnje klase. Ako treba, koristite unutrašnji klas. Ako ne, statički ugnježdeni klas je prikladniji, jer nije povezan sa instancom spoljašnje klase i može biti efikasniji.