В чем различие между использованием оператора 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) метода, использование которого в свою очередь позволяет реализовать более гибкий код, предоставляющий возможность композиции.
Тэги: Class, instanceof, isAssignableFrom


