Klasy wewnętrzne i anonimowe tzw. cookbook
I po urlopiku. W tym roku tylko kilka dni, że dzielnie sprostałem wyzwaniu euro50 to zrobiłem sobie też dłuższą przerwę od blogowania.
Na wstępnie ogłoszenia parafialne:
- Z dniem 30 czerwca zakończyłem pracę z KIR S.A.
- Z dniem 1 Lipca ruszam z własnym biznesem pod firmą Tyrsoft.
- Poszukuję ogarniętego i w miarę taniego grafika płci dowolnej w celu przygotowania logo, pocięcia pod szablon WP itp. dupereli.
- Astra III ma zanurzenie do wysokości osi i dobrze to znosi.
Lecimy z meritum.
Klasy anonimowe
Pochodzą z Gali. Mechanizm ich działania jest wiadomym. Klasa taka jest w Javie bardzo prymitywnym odpowiednikiem domknięcia. Dwie ważne rzeczy związane z tego typu klasami to:
- Korzystając z elementów klasy w której została utworzona zawsze korzystamy z elementów bieżącej instancji.
- Tego typu klas nie testujemy. Nie ma to większego sensu ponieważ są one prywatnym bebechem klasy w której zostały utworzone.
Klasa rozszerzająca in-line
To jest taki sprytny potworek, który pozwala na tworzenie klas rozszerzających in-line. Też można to traktować jak prymitywne domknięcie. Osobiście używałem tego tylko raz gdy nie mogłem użyć normalnego mechanizmu AOP, a bardzo chciałem. Przykładowy kod:
Listing 1. Klasa rozszerzająca in-line
public class App {
public static void main(String[] args) {
new A().m();
new A() {
public void m() {
System.out.println("eeeee");
}
}.m();
}
}
class A {
public void m() {
System.out.println("aaaa");
}
}
Jak widać może to być przydatne jeżeli chcemy w jakimś konkretnym miejscu wzbogacić lub zmienić działanie klasy, ale nie możemy użyć AOP i nie chcemy pisać kolejnej klasy.
Klasy wewnętrzne
Są dwa typy klas wewnętrznych.
Klasy statyczne
Są to normalne klasy, które dzięki zamknięciu w innej klasie wprowadzają dodatkowy poziom przestrzeni nazw. Można to wykorzystać na wiele sposobów. Moim faworytem jest ten z Vaadin gdzie każda klasa, która obsługuje listenery ma własne wewnętrzne, statyczne definicje interfejsów. Dzięki temu nie podepniemy listenera przycisków do np. menu. Klasy te wymagają normalnego testowania. Co ważne nie mogą korzystać z niestatycznych elementów klasy w której są umieszczone.
Klasy niestatyczne
Różnią się od poprzednich tym, że mogą korzystać z niestatycznych składników klasy w której są umieszczone. istotne jest jednak to, że instancję takiej klasy tworzymy w oparciu o istniejącą instancję klasy zawierającej i odwołując się do składników tej klasy odwołujemy się do składników instancji w ramach której została utworzona nasza klas. Jasne, prawda 😀
Podsumowanie
Klasy wewnętrzne i anonimowe to potężna broń w javie. Trzeba jednak ogarniać zasięgi inaczej będzie jak tu.