Czy instanceof jest uważany za złą praktykę? Jeśli tak, to w jakich okolicznościach instanceof jest nadal preferowany?

Przez lata starałem się unikać instanceof kiedy tylko było to możliwe. Za pomocą polimorfizmu lub wzorca odwiedzającego, w stosownych przypadkach. Przypuszczam, że w niektórych sytuacjach po prostu ułatwia konserwację... Czy są jakieś inne wady, o których należy pamiętać?

Widzę go jednak tu i ówdzie w bibliotekach Javy, więc przypuszczam, że ma swoje miejsce? W jakich okolicznościach jest to korzystne? Czy jest to nieuniknione?

Author: BalusC, 0000-00-00

2 answers

Mogę sobie wyobrazić pewne przypadki, na przykład masz pewne obiekty biblioteki, których nie możesz rozszerzyć( lub byłoby to niewygodne), być może zmieszane z niektórymi obiektami Twojej, wszystkie z tą samą klasą bazową, razem w kolekcji.
Przypuszczam, że w takim przypadku użycie instanceof do rozróżnienia niektórych procesów na tych obiektach może być przydatne.

Idem w jakiejś konserwacji kodu starszego, gdzie nie można wprowadzić nowego zachowania w wielu starych klasach tylko po to, aby dodać nowy mały funkcja lub jakaś poprawka błędu...

 10
Author: PhiLho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-01 16:55:06

To zdecydowanie ma swoje miejsce w implementacji akcji equals. Np.

public boolean equals ( Object o )
{
  if ( this == o )
  {
     return true;
  }

  if ( ! (o instanceof MyClass) )
  {
    return false;
  }

  // Compare fields
  ...
}

Ciekawostką na temat instanceof jest to, że jej LHS może być null i w takim przypadku wyrażenie jest ewaluowane do false.

 20
Author: Alexander Pogrebnyak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-01 17:02:40