У меня есть иерархия классов, представляющая различные языковые конструкции:
Expression <- NumericLiteral
UnaryExpression
BinaryExpression
IndexingExpression
IteratedExpression
...
Объекты этих классов образуют сложные иерархии деревьев, в которых мне приходится выполнять различные структурные проверки, например, если узел является выражением IteratedExpression, то егоПервый дочерний элемент должен быть IndexingExpression.Если проверка включает только один уровень, я могу использовать шаблон Visitor, но в более сложных случаях, как в примере ниже, я использую instanceof.
void visit(IteratedExpression node) {
if (!(node.getChild(0) instanceof IndexingExpression)) {
// report error
}
}
Это правильное использование instanceof или у меня есть недостатокв моем дизайне?Какие есть альтернативы?
Поскольку были предложены некоторые альтернативы, я хотел бы подчеркнуть первую часть вопроса:
Это правильное использование instanceof или у меня есть изъянв моем дизайне?