Gyakorlati alapok III.
Osztály csakis belsőleg (a belső osztály)
Ha a Javán belüli kódhierarchiára egy gyors pillantást vetünk, láthatjuk, hogy a rendszerben az osztályok nagyjából "középszinten", egymás mellett helyezkednek el (mert felettük létezik még egy kódrendszerező hierarchia, ez pedig a csomagok /package/ rendszere).
A Javán belül azonban lehetőségünk van egy további osztály létrehozására egy, már meglévő osztályon belül. Ezt a további kódtagolási lehetőséget nevezzük belső osztálynak (nested class).
A belső osztályt úgy képzelhetjük el, mint egy 1 ajtós belső szobát, amelyet csakis a külsőből érhetünk el és amelyet ezért kívülről nem is láthatunk. Voltaképpen ez a belső osztály fő előnye: mivel kívülről nem látható, működése hasonlatos a private deklarálású osztályhoz, bár megismerésének, láthatóságának további gátját jelenti, hogy kódja ezért nem is a középszintű osztályhierarchiában foglal helyet, hanem belsőként az egyik osztályban, ezáltal pedig gyakorlatilag rejtve marad.
A belső osztályt tehát csakis az ő kódját tartalmazó külső osztály ismeri, illetve ez fordítva is igaz, következésképpen kölcsönösen felismerik egymás objektumait. Ezen "rejtőzködő" tulajdonsága miatt néhány szakkönyv óva int a belső osztályok túlzott használatától.
Az alábbi futtatható Java-példakódban egyszerű műveleteket láthatunk, de a helyzet bonyolultságához igazítva:
-
a Kulso osztályban deklaráltunk egy Belso osztályt,
-
a Kulso osztálynak van 1 kiiras(), a Belso osztálynak pedig 1 osszeadas() metódusa,
-
megpróbáljuk úgy alakítani a kódot, hogy az objektumok felismerjék egymást és tudjanak együtt dolgozni. Ha sikerül az összeadás eredményének kiírása (kulso.kiiras(belso.osszeadas(1,2))), akkor ezt meg is valósítottuk.
public class Kulso {
public void kiiras(Object object){
System.out.println(object);
}
public static void main(String args[]) {
Kulso kulso = new Kulso();
Belso belso = new Belso();
kulso.kiiras(belso.osszeadas(1,2));
}
}
class Belso{
public int osszeadas(int a, int b){
return a + b;
}
}
Végeredmény:
3
Utolsó gondolatként jegyzem meg, hogy ez a belső kódtagoltság még tovább fokozható többszörösen egymásba ágyazott osztályok, vagy éppen lokálisan (alblokkban) deklarált osztályok használatával.