例如,我从ASTParser获得了一个CompilationUnit。为什么我需要接受访问者而不是使用常规方法:
ASTParser parser ... //all that stuff
CompilationUnit unit = (CompilationUnit) parser.createAST(null);
然后我做了:
unit.types() //get all type declarations
从这里开始我只是继续沿着AST直到叶子节点就像那样没有使用访问。使用访客模式而不是我提出的建议有什么好处?
答案 0 :(得分:0)
访问者(ASTVisitor
的子类型)的目的是遍历整个AST,因此您可以轻松地检查每个AST节点(除非访问方法返回false,此时子树下面的子树)跳过当前节点。)
直接查询AST时,您负责遍历所有有趣的节点。
使用unit.types()
时,您只能获得顶级类型声明,但使用访问者可以轻松处理编译单元中的所有类型,包括嵌套类型。
正确实施时,两种方法都应表现出相同的行为。因此,差异在于需要编写的代码量和代码的清晰度(受过训练的眼睛会立即了解访问者的使用情况,但需要仔细阅读手动遍历)。