Następny artykuł z cyklu o języku Java będzie opisywać przypadek użycia typu ogólnego T w klasie. Zobacz jak wygląda i do czego może nam się przydać klasa generyczna w języku Java. Wymagana wiedza teoretyczna z zakresu programowania ogólnego. Reszta włazić do środka i nie dyskutować 😂!
KLASA GENERYCZNA W JĘZYKU JAVA WYRÓŻNIA SIĘ JEDNYM SZCZEGÓŁEM
Tym szczegółem jest typ T osadzony w nawiasach kątowych. Jak wspomniałem w artykule opisującym programowanie generyczne, typ T jest niewiadomy. Nie wiemy czym on może być na etapie projektowania takiej klasy. To może być wszystko i nic, choć naturalnie możemy nakładać ograniczenia na dopuszczalny przedział klas jakie możemy podstawić. Po co się je dodaje? Ano po to, żeby móc korzystać z danych składowych i metod z danej grupy klas lub interfejsów.
WYGLĄD W KODZIE
Najprostsza forma może wyglądać tak:
public class GenericClass<T> {
private final T instance;
public GenericClass(T instance) {
this.instance = instance;
}
public T getInstance() {
return instance;
}
}
Kiedy w klasie generycznej pojawia się dana składowa typu T, to przy tworzeniu instancji możemy podstawić DOWOLNY obiekt, który spełnia określone wcześniej warunki (jeżeli jakieś zostały zdefiniowane). To oznacza, że gdy później będziemy odwoływać się do niej za pomocą metody ("getter'a"), to typ generyczny natychmiast "wciela się" w skonkretyzowany obiekt. Innymi słowy, gdy konstruktor już "wie" jaką dana składowa ma przyjąć postać, to wówczas "transformuje się" ukrycie w typ ściśle określony.
Dla przykładu, gdy mając powyższą definicję klasy generycznej podstawimy do niej klasę "JPanel", to wówczas instancja klasy dostosowuje się "za plecami" i formułuje w taki sposób:
public class GenericClass<JPanel> {
private final JPanel instance;
public GenericClass(JPanel instance) {
this.instance = instance;
}
public JPanel getInstance() {
return instance;
}
}
Dzięki temu, typy generyczne konkretyzują się pod podstawiony obiekt i w ten sposób możemy się odwoływać do danych składowych i metod klasy "JPanel".
Oto przykład jak wygląda tworzenie instancji w oparciu o typ generyczny i gdzie widać zjawisko tej transformacji:
GenericClass<Float> genericClassFloat = new GenericClass<>(5.42f);
GenericClass<JButton> genericClassButton = new GenericClass<>(new JButton());
System.out.println(genericClassFloat.getInstance().isNaN());
System.out.println(genericClassButton.getInstance().getFont());
Zobacz jak wygląda instrukcja tworzenia obiektu. Piszemy nazwę klasy, a zaraz po tym otwieramy nawiasy trójkątne i wewnątrz nich podajemy KONKRETNY TYP klasy, jaka nas interesuje. Kiedy podstawimy "Float", Java będzie od nas oczekiwać podania liczby zmiennoprzecinkowej i taką będzie potem reprezentować (przykład wywołania "isNaN"). Jeżeli podstawimy "JButton", to możemy dostać się do metod klasy "JButton" (przykład wywołania "getFont"). W taki sposób to działa.
Klasa generyczna może mieć nakładane ograniczenia na typ T, które pozwalają wywoływać dane składowe i metody z poszczególnych klas, a nawet interfejsów 😉! Więcej informacji w osobnym artykule.
Klasa generyczna w języku Java zawiera w sobie typ ogólny T, co wymusza podanie konkretnego typu klasy podczas tworzenia instancji.
To wszystko co trzeba wiedzieć po rzetelnym przestudiowaniu tego materiału 😉.