Jason. Cała informatyka w jednym miejscu!

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 💪.

Słowo kluczowe "instanceof" w języku Java

"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ć.

PODOBNE ARTYKUŁY