Java 状态和访问者模式
在我正在构建的应用程序中,我试图使用访问者模式收集大量的状态,这些模式稍后将被操作。这是使用ANTLR 4收集状态的典型方法还是反模式?如果不是,你能提供一个如何处理状态的例子吗 您还应该在遍历时更新域对象,还是在遍历访问者外部后实现所有业务逻辑 我所看到的所有ANTLR 4示例都太小了,我正在寻找如何在真实场景中使用它 多谢各位Java 状态和访问者模式,java,state,antlr,antlr4,visitor,Java,State,Antlr,Antlr4,Visitor,在我正在构建的应用程序中,我试图使用访问者模式收集大量的状态,这些模式稍后将被操作。这是使用ANTLR 4收集状态的典型方法还是反模式?如果不是,你能提供一个如何处理状态的例子吗 您还应该在遍历时更新域对象,还是在遍历访问者外部后实现所有业务逻辑 我所看到的所有ANTLR 4示例都太小了,我正在寻找如何在真实场景中使用它 多谢各位 public class JavaClassVisitor extends JavaBaseVisitor < String > { priva
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);
}
}
public类JavaClassVisitor扩展了JavaBaseVisitor{
私有JavaClassVisitorState jcvs=新JavaClassVisitorState();
@凌驾
公共列表visitParseContext(ParseContext ctx){
探视儿童(ctx);
返回jvcs.getAccessSpecifiers().toString();
}
@凌驾
公共列表visitClassDeclaration(ClassDeclarationContext ctx){
IdentifierContext idCtx=ctx.Identifier();
if(idCtx!=null){
String accessSpecifier=idCtx.getText();
ListaccessSpecifiers=jcvs.getAccessSpecifiers();
add(accessSpecifier);
}
回访儿童(ctx);
}
@凌驾
公共列表<字符串>访问方法声明(MethodDeclarationContext ctx){
IdentifierContext idCtx=ctx.Identifier();
if(idCtx!=null){
String accessSpecifier=idCtx.getText();
ListaccessSpecifiers=jcvs.getAccessSpecifiers();
add(accessSpecifier);
}
回访儿童(ctx);
}
}
为了保持Stackoverflow的典型问答风格,我回答了一个问题,这是本文的核心
我不知道ANTLR4的“典型”访问者模式。这一切都取决于背景和你想要实现的目标。如果您需要更新域对象,并决定在访问者中进行更新,那么就这样做吧
访问者模式并不局限于收集数据。更新也是一个有效的操作。ANTLR4中的访问者和侦听器的工作方式非常相似,都是在解析树上遍历深度优先。这两种调用方法都特定于它们在树中看到的每个解析上下文。主要区别在于,侦听器执行一般的漫游,而访问者可以返回自定义值(适用于评估器之类的事情,即使您也可以在访问者的成员变量中保留中间值)。这里有多个问题,所有问题都是基于意见的。询问“如何处理访问者的状态”太宽了。而是针对你看到的具体问题提出具体问题。