Opiszę jeszcze jedno słowo kluczowe, jakie występuje w języku Java, a nie bywa częstym gościem w kodzie: "instanceof". Materiał krótki i treściwy, więc jak jesteś zainteresowany(-a), to wejdź i dowiedz się więcej...jak zwykle za darmo 😄!
"INSTANCEOF" W JĘZYKU JAVA SPRAWDZI CI TYP KLASY CZY NALEŻY DO HIERARCHII DZIEDZICZENIA
"instanceof" to prosta instrukcja weryfikująca typ klasy pod kątem dziedziczenia. Czasem jest tak, że musimy przeprowadzić rzutowanie z klasy bazowej na potomną, bo wymaga tego jakaś sytuacja:
BaseClass baseClass = new DerivedClass();
DerivedClass derivedClass = (DerivedClass)baseClass;
To jest ryzykowne! Co, jak się okaże, że hierarchicznie typy się nie zgadzają 😳? Wyłoży się program zgłaszając wyjątek "ClassCastException"! W programowaniu powinniśmy trzymać się zasady, żeby "dmuchać na zimne" - zatem tak samo, jak wywołujemy metody przez zmienną referencyjną i powinniśmy zapobiegać odwołaniom przez wartość "null", tak i w tym przypadku, powinniśmy nałożyć zabezpieczenie, zanim sobie pozwolimy na taki manewr.
"instanceof" w języku Java piszemy tak:
if(baseClass instanceof DerivedClass) {
DerivedClass derivedClass = (DerivedClass)baseClass;
}
Już. Instrukcja warunkowa, zmienna referencyjna wskazująca na klasę bazową, słowo kluczowe "instanceof", typ klasy potomnej (tym razem typ, nie zmienna). Możesz też napisać to nieco krócej stosując "pattern variable" i kompletnie uniknąć operacji rzutowania, która wykona się automatycznie w przypadku spełnienia tego warunku 👍:
if(baseClass instanceof DerivedClass derivedClass) {
}
To uchroni przed potencjalnym zagrożeniem w postaci próby rzutowania typu z klasy bazowej na klasę potomną.
JAKIM CUDEM TO DZIAŁA SKORO TYP WSKAZUJE NA KLASĘ BAZOWĄ?
Nie zastanawia Cię jak to się dzieje, że "instanceof" w języku Java potrafi zidentyfikować kiedy to ma sens, a kiedy nie 😊? Podstawą opanowania każdego zagadnienia jest zrozumienie co się z tym dzieje 🙂. Mimo faktu, iż typ zmiennej to klasa bazowa, to "podskórnie" kompilator "widzi", że jest to typ klasy potomnej 😯. Tu dotykamy kluczowych pojęć: "wiązanie statyczne" (ang. static binding) i "wiązanie dynamiczne" (ang. dynamic binding) 🎀.
Wiązanie statyczne oznacza sugerowanie się typem deklarowanym - to, co umieszczamy przed nazwą zmiennej referencyjnej, to typ deklarowany:
BaseClass baseClass = new BaseClass(); // typ deklarowany = BaseClass
Z kolei wiązaniem dynamicznym określamy sytuację, w której kompilator uwzględnia typ klasy w oparciu o referencję (wskaźnik):
BaseClass baseClass = new DerivedClass(); // typ referencyjny = DerivedClass
Kompilator w momencie próby rzutowania na ten sam typ "zauważy", że się zgadzają i dlatego ta operacja przejdzie pomyślnie 💪.
"instanceof" sprawdza zgodność podanego typu klasy ze zmienną referencyjną czy, na podstawie hierarchii dziedziczenia, wolno wykonać rzutowanie na klasę potomną.
To wszystko. "instanceof" w języku Java jest rzadko stosowane, gdyż są (i powinny być) praktykowane inne, mniej ryzykowne sposoby uzyskiwania dostępu do konkretnych typów klas ✅. Niemniej jednak parę słów warto było wrzucić.