instanceof, вероятно, будет более дорогостоящим, чем простое равенство, в большинстве реализаций реального мира (то есть тех, где instanceof действительно необходим, и вы не можете просто решить его путем переопределения общего метода, как каждый учебник для начинающих а Демиан выше предлагает).
Почему это? Потому что, вероятно, произойдет то, что у вас есть несколько интерфейсов, которые предоставляют некоторую функциональность (скажем, интерфейсы x, y и z) и некоторые объекты для манипулирования, которые могут (или нет) реализовывать один из этих интерфейсов ... но не напрямую. Скажем, например, у меня есть:
ш расширяет х
A реализует w
B расширяет A
C расширяет B, реализует y
D расширяет C, реализует z
Предположим, я обрабатываю экземпляр D, объект d. Для вычислений (d instanceof x) требуется взять d.getClass (), пройтись по циклам через интерфейсы, которые он реализует, чтобы узнать, является ли один == к x, и если нет, сделать это снова рекурсивно для всех их предков ...
В нашем случае, если вы сначала исследуете это дерево в ширину, вы получите как минимум 8 сравнений, предположив, что y и z ничего не расширяют ...
Сложность дерева деривации в реальном мире, вероятно, будет выше. В некоторых случаях JIT может оптимизировать большую часть его, если он может заранее разрешить d как во всех возможных случаях экземпляр чего-то, что расширяет x. Реально, однако, вы будете проходить через это дерево большую часть времени.
Если это станет проблемой, я бы предложил вместо этого использовать карту обработчика, связав конкретный класс объекта с замыканием, которое выполняет обработку. Это удаляет фазу обхода дерева в пользу прямого отображения. Однако помните, что если вы установили обработчик для C.class, мой объект d выше не будет распознан.
вот мои 2 цента, надеюсь, они помогут ...