AST:访问和只使用查询方法有什么区别?

AST: what's the difference between visiting and just using query methods?

例如,我从 ASTParser 获得了一个 CompilationUnit。为什么我需要接受访问者而不是使用正常方法:

ASTParser parser ... //all that stuff

CompilationUnit unit = (CompilationUnit) parser.createAST(null);

然后我做:

unit.types() //get all type declarations

从这里开始,我只是继续向下访问 AST,直到叶节点就这样,而不使用访问。使用访问者模式比我建议的有什么优势?

访问者(ASTVisitor 的子类型)的目的是遍历整个 AST,因此您可以毫不费力地检查每个 AST 节点(除非访问方法 returns false,此时点当前节点下面的子树被跳过)。

直接查询AST时,你负责遍历到所有感兴趣的节点。

当使用 unit.types() 时,您只能获得顶级类型声明,但使用访问者可以轻松处理编译单元中的所有类型,包括嵌套类型。

如果正确实施,两种方法应该表现出相同的行为。因此区别在于需要编写的代码量和代码的清晰度(训练有素的眼睛会立即理解访问者的用法,但需要仔细阅读手动遍历)。