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.