Java średnio zaawansowane #11: 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/

Może Ci się również spodoba

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *