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
staticmodifikatoriumi. - 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
staticmodifikatoriaus. - 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ė.