Если «причина» обращения с классом по-другому - это проектное решение, пометьте его как подпись интерфейса, как в решении 1.
Если есть вероятность, что какое-то состояние в вашем приложении будет регулировать это, используйте решение 2.
И примером этого является интерфейс java.io.Serializable без методов или полей, который используется для идентификации реализаций, которые сериализуются. Во время разработки вы решаете, был ли объект сериализуем.
Примечание о производительности instanceof , после дополнительного комментария.
Вы также можете посмотреть на использование Аннотации в качестве альтернативы ...
- РЕДАКТИРОВАТЬ ПОСЛЕ КОММЕНТАРИИ НА ПРАВЛЕНИИ ---
Если вы действительно хотите не отказываться от экземпляра (который очень быстр) или аннотаций, вы можете сделать это ..
interface Special {
bool isSpecial();
}
abstract class RuntimeSpecial implements Special {
protected abstract bool _determineSpecial();
public isSpecial() { return _determineSpecial(); }
}
class IsSpecial implements Special {
public isSpecial() { return true; }
}
class IsNotSpecial implements Special {
public isSpecial() { return false; }
}
Теперь расширьте все, что подходит ....