2010-09-23 2 views

ответ

14

Мне нужно использовать подсказки instanceof при плохом дизайне. Это верный признак того, что будет построена большая сложная конструкция в стиле переключателя. В большинстве случаев, когда я вижу, что он используется, мы должны использовать полиморфизм, а не instanceof. См. Шаблон стратегии. (relevant examples of use)

Единственный раз, когда я нахожу, мне нужно использовать его при внедрении equals(Object o).

+0

На самом деле, стратегия должна решить, что должно быть сделано в соответствии с известными критериями (например, тип), но для отправки неизвестных типов на разные ветви кода с использованием полиморфизма используется шаблон [Посетитель] (http: // en .wikipedia.org/wiki/Visitor_pattern) –

+0

IMO instanceof лучше, чем полиморфизм - это ситуации особого случая, когда метод имеет смысл только в одном подклассе, а родительский класс и/или другие подклассы будут вынуждены внедрять методы заглушки, которые не имеют смысла в их контексте. Даже тогда следует попытаться вызвать метод специального случая из унаследованного метода, но если это громоздко, то использование instanceof совершенно оправдано. –

0

Когда вы знаете передаваемый объект, вам не нужно его использовать. Если есть какая-либо неоднозначность (например, два класса, реализующие один и тот же интерфейс), то рекомендуется продолжить использование instanceof.

4

Кастинг от базового типа до производного типа - это плохая вещь. Если вы используете instandof таким образом, это считается плохим дизайном, потому что его трудно поддерживать и читать. См. http://www.javapractices.com/topic/TopicAction.do?Id=31.

Использование instanceof для equals(), поскольку у вас есть object, который должен быть вашим типом, это хорошая практика.

3

Один хороший пример использования будет проверять интерфейсы маркеров, такие как RandomAccess.

0

Использование instanceof при переопределении метода equals объекта необходимо, поскольку два объекта не могут быть равными, если они имеют разные типы. Я редко сталкиваюсь с другой ситуацией, когда требуется экземпляр - возможно, если требуется downcasting, но может возникнуть исключение ClassCastException.

Смежные вопросы