代码之家  ›  专栏  ›  技术社区  ›  vitaut

在处理对象树时,我应该避免instanceof吗?

  •  2
  • vitaut  · 技术社区  · 15 年前

    我有一个表示不同语言结构的类层次结构:

    Expression <- NumericLiteral
                  UnaryExpression
                  BinaryExpression
                  IndexingExpression
                  IteratedExpression
                       ...
    

    这些类的对象形成复杂的树层次结构,我必须对其执行各种结构检查,例如,如果节点是IteratedExpression,那么它的第一个子节点应该是IndexingExpression。如果检查只涉及一个级别,我可以使用Visitor模式,但在更复杂的情况下,如下面的示例中所示,我使用instanceof。

    void visit(IteratedExpression node) {
        if (!(node.getChild(0) instanceof IndexingExpression)) {
            // report error
        }
    }
    

    是正确使用instanceof还是我的设计有缺陷? 有哪些选择?

    是正确使用instanceof还是我的设计有缺陷?

    2 回复  |  直到 15 年前
        1
  •  3
  •   Knatpolsar    15 年前

    这样地:

    class Visitor {
      boolean indexingExpected;
      void startIteratedExpression() {
        indexingExpected = true;
      }
      void doIndexing() {
        indexingExpected = false;
      }
      void someOtherVisit() {
        if (indexingExpected) {
          throw IllegalStateException();
        }
      }
    }
    clas IteratedExpression {
      private List<Expression> children;
      public void visit(Visitor visitor) {
        visitor.startIteratedExpression();
        for(Expression child : childrenExpression) {
          child.visit(visitor);
        }
        visitor.endIteratedExpression();
      }
    }
    class IndexingExpression extends Expression {
      public void visit(Visitor visit) {
        visitor.doIndexing();
      }
    }
    

    如果你想使用访问者,在你的树上有多少级别并不重要。

        2
  •  1
  •   Itay Karo    15 年前

    将抽象方法添加到 Expression 并在孩子身上实施。
    所以每个班级都有自己的支票。