Прежде всего, Java на самом деле имеет отличные перечисления, которые можно использовать полиморфно. Я не программист на Java, поэтому кто-то другой может привести хороший пример (не могу). Кроме того, учтите, что полиморфизм часто просто излишним. Я также только что видел этот разговор, и он великолепен, но он содержит только рекомендации, а не серебряную пулю.
Особенно не верно, что все switch
операторы могут быть заменены. На самом деле конечные автоматы - это тот случай, когда перечисления имеют большой смысл. Я часто использую конечные автоматы при разборе. Конечно, это можно сделать с помощью шаблона проектирования и класса полиморфизма. Но это намного ( намного ) больше кода, он выполняет ту же работу, но медленнее, он не более читабелен, и это решение, которое необходимо только в одном месте, без какой-либо переработки кода. Использование подклассов здесь просто не имеет никакого преимущества.
Опять же, это исключение. В целом, создание подклассов часто является лучшим решением для языков, которые его хорошо поддерживают.
РЕДАКТИРОВАТЬ: Я заметил, что это может вызвать противоречия. Конечно, есть много хороших решений, которые инкапсулируют разбор, от регулярных выражений до каркасов генератора синтаксических анализаторов, таких как Antlr. Ничего плохого в них нет, и во всех, кроме тривиальных случаях, это лучшее решение. Тем не менее, я много работаю с низкоуровневым кодом (очевидно, не в Java), где регулярные выражения не поддерживаются и генераторы синтаксических анализаторов также несут накладные расходы.