Java #28: instanceof operator

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/

Stay in the Loop

Get the daily email from CryptoNews that makes reading the news actually enjoyable. Join our mailing list to stay in the loop to stay informed, for free.

Ostatnio dodane

- Advertisement - spot_img

Powiązane wpisy