Как я всегда это понимал, основными случаями, когда подходит instanceof, являются:
- Реализация
Object.equals(Object). Поэтому, если бы я писал классListи не расширялAbstractListпо какой-либо причине, я бы выполнилequals(o), сначала проверивo instanceof List, а затем сравнив элементы. - Значительная (алгоритмическая?) оптимизация для особого случая, который не меняет семантики, а только производительность. Например,
Collections.binarySearchвыполняет тестinstanceof RandomAccessи использует немного другой бинарный поиск для списковRandomAccessи nonRandomAccess.
Я не думаю, что instanceof представляет запах кода в этих двух случаях. Но есть ли другие случаи, когда разумно использовать instanceof?