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/

