Jason. Cała informatyka w jednym miejscu!

Java pozwala na osadzanie jednej klasy w środku drugiej stając się klasą zagnieżdżoną (wewnętrzną). Taka klasa wewnętrzna w języku Java była często wykorzystywana przed wprowadzeniem wyrażeń lambda w Javie 8. Sięgnijmy do historii i zobaczmy do czego może się nam przydać "wklejanie" jednej klasy do drugiej!

KLASA WEWNĘTRZNA W JĘZYKU JAVA CZYLI ZAGNIEŻDŻANIE KLAS

Traktujcie klasę wewnętrzną jak "klasę w klasie". I to dosłownie. Zanim twórcy Javy wymyślili wyrażenie lambda, trzeba było sobie radzić "w obejściu". Taka klasa była odrębnym blokiem kodu, która znajdowała się w klasie właściwej trzymającej tę drugą "w środku". Oprócz podpinania zdarzeń do jakiegoś komponentu będącego źródłem zdarzeń, nie było innych praktycznych zastosowań poza zwiększeniem organizacji kodu czy podkreśleniem relacji pomiędzy klasami. Stąd też istniała głównie jako "ułatwiacz łączności" dla metod oczekujących klasy implementującej wymagany interfejs np. "addActionListener". Klasa wewnętrzna posiada dostęp do wszystkich danych składowych i metod klasy zewnętrznej, zarówno tych publicznych, jak i prywatnych. Obecnie jest rzadko wykorzystywana z powodu istnienia bardziej zwięzłej alternatywy w postaci wyrażenia lambda. Więcej się o tym napisać nie da.

PRZYKŁAD KODU ŹRÓDŁOWEGO

Popatrzmy na przykładowy program wykorzystujący klasę wewnętrzną w akcji:

KLASA "MAIN"

public class Main {
	public static void main(String[] args) {
		OuterClass oc = new OuterClass(25);
	}
}

KLASA "OUTERCLASS"

public class OuterClass {
	private int x;

	public OuterClass(int x) {
		InnerClass ic = new InnerClass();
		
		this.x = x;
		
		ic.printX();
		ic.printY();
	}

	private class InnerClass {
		private int y = 45;

		private void printX() {
			System.out.println(x);
		}

		private void printY() {
			System.out.println(y);
		}
	}
}

Można dostrzec ciekawe zależności. Klasa wewnętrzna w języku Java ma dostęp do danych składowych i metod, nawet tych prywatnych! To działa w obie strony! Mimo tego, że metody klasy wewnętrznej "printX" i "printY" są prywatne, to jednak można bez żadnych problemów je wywołać z poziomu klasy zewnętrznej. Zwróćcie jeszcze uwagę na utworzenie instancji tej klasy! Tu nie ma taryfy ulgowej i też musimy zadbać o utworzenie instancji.

KLASA WEWNĘTRZNA NA ZEWNĄTRZ KLASY?

Zabawa się jeszcze bardziej rozkręca gdybyśmy chcieli utworzyć instancję klasy wewnętrznej na zewnątrz tej klasy, która ją posiada! Wówczas musielibyśmy uczynić klasę wewnętrzną publiczną, dorzucić cały "sznurek" odwoływania się do poszczególnych klas w miejsce typu, a po znaku przypisania odwołać się do instancji klasy zewnętrznej i wtedy skorzystać z konstruktora:

OuterClass.InnerClass ic = oc.new InnerClass();

Uwaga na bardzo nietypowe miejsce słowa kluczowego "new" (zaraz po kropce)! Jeśli mieliście na myśli taki zapis:

OuterClass.InnerClass ic = new OuterClass.InnerClass();

to muszę Was zmartwić. To stanie się możliwe wyłącznie w przypadku statycznej klasy wewnętrznej.


Żeby nie wchodzić głębiej w szczegóły, na tym zakończę prezentowanie klas wewnętrznych.

PODOBNE ARTYKUŁY