java - 国家和访客模式
问题描述
在我正在构建的应用程序中,我试图使用稍后将被操纵的访问者模式来收集大量状态。这是使用 ANTLR 4 收集状态的典型方式还是反模式?如果不是,您能否提供一个如何处理状态的示例?
您还应该在遍历访问者外部时更新域对象还是在遍历访问者之外实现所有业务逻辑?
我见过的所有 ANTLR 4 示例都太小了,我真的在寻找如何在现实世界的场景中使用它。
谢谢你。
public class JavaClassVisitor extends JavaBaseVisitor < String > {
private JavaClassVisitorState jcvs = new JavaClassVisitorState();
@Override
public List < String > visitParseContext(ParseContext ctx) {
visitChildren(ctx);
return jvcs.getAccessSpecifiers().toString();
}
@Override
public List < String > visitClassDeclaration(ClassDeclarationContext ctx) {
IdentifierContext idCtx = ctx.Identifier();
if (idCtx != null) {
String accessSpecifier = idCtx.getText();
List < String > accessSpecifiers = jcvs.getAccessSpecifiers();
accessSpecifiers.add(accessSpecifier);
}
return visitChildren(ctx);
}
@Override
public List < String > visitMethodDeclaration(MethodDeclarationContext ctx) {
IdentifierContext idCtx = ctx.Identifier();
if (idCtx != null) {
String accessSpecifier = idCtx.getText();
List < String > accessSpecifiers = jcvs.getAccessSpecifiers();
accessSpecifiers.add(accessSpecifier);
}
return visitChildren(ctx);
}
}
解决方案
为了保持 Stackoverflow 的典型问答风格,我回答一个问题,这是 IMO 的核心。
我不知道 ANTLR4 的“典型”访问者模式。这一切都取决于上下文以及您要完成的工作。如果您需要更新域对象并决定在访问者中执行此操作,那就这样吧。
访问者模式并不局限于收集数据。更新也是一个有效的动作。ANTLR4 中的访问者和听众的工作方式非常相似,都是深度优先地遍历解析树。两者都调用特定于他们在树中看到的每个解析上下文的方法。主要区别在于侦听器执行通用遍历,而访问者可以返回自定义值(对于评估器之类的东西很有用,即使您也可以将中间值保留在访问者的成员变量中)。
推荐阅读
- debugging - 如何使用 WinDbg 从挂起的进程中调试小型转储
- reactjs - 限制导航以防止浏览器在 React App 中挂起
- react-native - 反应原生图像,动态需求
- javascript - 如何识别代码中的哪个 java/javascript 文件生成了特定的 cookie?
- sql - 为什么我的插入表格的代码带有错误警告
- android - 如何修复由于资格问题而被谷歌 Play 商店拒绝的 Android 应用程序?
- java - 创建一个包含 10 个整数元素的堆栈,然后添加一个具有函数的元素
- c# - 如何并行调用一些方法并从这些方法中获取信息?
- javascript - 有没有办法让角材料表保持扩大?(带有 tr 和 td,不是 mat-row 标签)
- python - 如何在类装饰器中添加属性?