Słowo kluczowe instanceof
Ta lekcja jest kontynuacją poprzedniej lekcji o interfejsach. Wkrótce zobaczysz, że interfejsy są używane bardzo często w języku Java. Najważniejsze jest zrozumienie, że interfejs to taka foremka, którą później trzeba wypełnić, ale póki jej nie użyjesz do końca nie wiesz, co w niej jest. I tu pojawia się problem.
Przeanalizuj wpierw poniższy kod.
public class Midfield implements Skillable { @Override public int pass() { return 16; } @Override public int attack() { return 14; } @Override public int defend() { return 12; } }
public class Defender implements Skillable { @Override public int pass() { return 9; } @Override public int attack() { return 5; } @Override public int defend() { return 18; } }
public class Striker implements Skillable { @Override public int pass() { return 15; } @Override public int attack() { return 17; } @Override public int defend() { return 9; } }
Powyższe trzy klasy implementują znany z poprzedniej lekcji interfejs Skillable.
public class WhichPlayerMain { public static void main(String[] args) { Skillable midfield = new Midfield(); Skillable striker = new Striker(); Skillable defender = new Defender(); Skillable[] players = new Skillable[3]; players[0] = defender; players[1] = midfield; players[2] = striker; showAttackSkillForStriker(players); } private static void showAttackSkillForStriker(Skillable ... players) { } }
Teraz wyobraź sobie sytuację, że do sygnatury metody zaimplementowanej (narzuconej) przez kogoś innego jako parametr przesyłasz tablicę interfejsu Skillable i musisz napisać jej ciało, tak aby wyświetlało wartość metody attack tylko i wyłącznie dla napastnika (ang. striker). Oczywiście w powyższym kodzie widać, że szukana implementacja interfejsu kryje się pod indeksem tablicy o numerze dwa. Jednak często w życiu będziesz otrzymywać dużo bardziej skomplikowany kod lub dane przychodzące do Twojej klasy będą trudne do wyśledzenia (np. będą przychodzić z innego systemu, itp.).
Sprawdzenie instancji klasy
Do rozwiązania tego problemu stworzono słowo kluczowe instanceof. Służy ono do tego, aby zajrzeć do używanego przez Ciebie interfejsu i spojrzeć jakiej klasy obiekt naprawdę się pod nim kryje. W moim przypadku będzie to jedna z trzech klas: Defender, Midfield lub Striker, które implementują Skillable. Może to być oczywiście więcej klas (wszystko zależności ile jest implementacji danego interfejsu).
private static void showAttackSkillForStriker(Skillable ... players) { for (int i = 0; i < players.length; i++) { if (players[i] instanceof Striker) { System.out.println(players[i].attack()); } } }
Powyższa implementacja metody showAttackSkillForStriker pozwala na sprawdzenie wszystkich implementacji interfejsu Skillable w celu wyświetlenia co zwraca metoda attack tylko i wyłącznie dla obiektów klasy Striker.
Link do lekcji: https://github.com/developeronthego/java-middle/tree/master/src/main/java/middle/lesson11
Lekcja o podstawach polimorfizmu: https://developeronthego.pl/java-srednio-zaawansowane-2-polimorfizm-podstawy-i-this/