Когда речь заходит о проверке принадлежности объекта к определенному классу или интерфейсу в Java, можно использовать два метода: instanceof
и Class.isAssignableFrom(...)
. Оба этих оператора используются для определения того, является ли объект экземпляром определенного класса или интерфейса. Но в чем же разница между ними?
Возьмем для примера следующий код:
Object a = new String("example"); boolean result = a instanceof String;
и
Object a = new String("example"); boolean result = String.class.isAssignableFrom(a.getClass());
В обоих случаях результат будет true
, поскольку a
действительно является экземпляром класса String
.
Однако существуют различия в поведении этих двух операторов. Главное различие заключается в том, как они обрабатывают null
значения.
Оператор instanceof
возвращает false
, если его левый операнд null
. Это означает, что следующий код:
Object a = null; boolean result = a instanceof String;
вернет false
, поскольку a
равно null
.
С другой стороны, метод Class.isAssignableFrom(...)
выбросит исключение NullPointerException
, если ему передать null
значение. Таким образом, следующий код:
Object a = null; boolean result = String.class.isAssignableFrom(a.getClass());
выбросит исключение NullPointerException
, поскольку a.getClass()
возвращает null
.
Таким образом, в то время как instanceof
безопасен для использования с null
значениями, Class.isAssignableFrom(...)
требует предварительной проверки на null
для избежания исключений. Это основное различие между instanceof
и Class.isAssignableFrom(...)
.
Добавить комментарий