Преждевременная оптимизация является первопричиной всех бед в программировании. Дональд Кнут

В чем различие между использованием оператора instanceof и Class.isAssignableFrom(…) метода?

Этим вопросом я задавался не один раз при разработке кода, определяющего принадлежность определённого экземпляра класса к определённой иерархии наследования, а так же принадлежность к реализации определённого интерфейса. В Java существует несколько подходов к решению данной проблемы, из которых мы обратим внимание на различие между использованием оператора instanceof и Class.isAssignableFrom(Class<?> cls) метода. Одним из главных различий является то, что использование оператора instanceof позволяет выявлять ошибки на уровне компиляции кода. Пример кода, позволяющий выявить ошибку времени компиляции, приведён в Листинге 1.

Листинг 1. Некорректное использование оператора instanceof

if(String.class instanceof Integer) {
    System.out.println("true");
}

В то время как код, приведённый в Листинге 2, в конечном итоге будет выполнен без каких-либо ошибок.

Листинг 2. Использование метода Class.isAssignableFrom(Class<?> cls)

if(Integer.class.isAssignableFrom(String.class)) {
    System.out.println("true");
}

Итак, использование оператора instanceof имеет место тогда, когда Вы четко знаете, в какой иерархии наследования участвует класс и какие интерфейсы он реализует, в противном случае целесообразно посмотреть в сторону Class.isAssignableFrom(Class<?> cls) метода, использование которого в свою очередь позволяет реализовать более гибкий код, предоставляющий возможность композиции.

Тэги: , ,

Оставить сообщение