Programowanie średniozaawansowane #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 nie 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.).

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.

 

Dodaj komentarz