Tag: visitor pattern

Java Enums – 在枚举上切换语句与访问者模式 – 性能优势?

我一直在寻找这个基于性能的问题的答案。 到目前为止,在挖掘了互联网之后,我了解到有几种方法可以在java中使用Enums, 这里有详细记载。 好吧,作为一个初学者,我希望在switch-case语句中使用Enums,这样可以提供清晰度并更好地理解代码。 但另一方面,我们还有一个访问者模式样式的Enums实现,它确保了类型的安全性和可扩展性, 这里讨论。 话虽如此,并回到这个问题背后的原始想法,到目前为止,我已经了解到如果使用Enums正确设计switch-case结构,这确保了case值不稀疏,并且Enum声明是相同的编译单元作为switch-case语句,java编译器通过实现跳转表这样的构造对生成的字节码执行一些优化(在这里和其他地方讨论过,在Sun的网站上,我丢失了链接)。 现在,与多个/嵌套的if-else构造相比,这肯定会提升性能。 我的问题是,java如何在生成的字节码中实现基于访问者模式的Enums实现,与基于switch-case的实现相比,性能提升是什么? 我应该选择哪种类型的实现,考虑到我的Enums可能在未来增长,我也热衷于性能。 目前,我的Enum中有一些19和奇数常量。 编辑 我有一个类存储有关游戏变量的一些信息。 其中一个变量是Enum类型。 public class GameObject { private Shape mShape; public Shape getShape() { return mShape; } . . . public static enum Shape { SHAPE1, SHAPE2, SHAPE3, SHAPE4, …, SHAPE20 }; public void drawShape() { switch (this.mShape) { case SHAPE1: drawShape1(); break; case […]

使用Java从具有访问者模式的AST构建控制流图

我正在试图弄清楚如何实现我的LEParserCfgVisitor类,以便从已经用JavaCC生成的Abstract-Syntax-Tree构建控制流图。 我知道有些工具已经存在,但我正在尝试为我的编译器最终做准备。 我知道我需要有一个数据结构,将图形保存在内存中,我希望能够在每个节点中保留IN,OUT,GEN,KILL等属性,以便以后能够进行控制流分析。 我的主要问题是我还没弄清楚如何将不同的块连接在一起,因为根据它们的性质在每个块之间有正确的边缘:分支,循环等。换句话说,我还没有找到一个明确的算法,可以帮助我建立我的访客。 这是我的空访客。 你可以看到它适用于基本的语言表达式,比如if,while和基本操作(+, – ,x,^,…) public class LEParserCfgVisitor implements LEParserVisitor { public Object visit(SimpleNode node, Object data) { return data; } public Object visit(ASTProgram node, Object data) { data = node.childrenAccept(this, data); return data; } public Object visit(ASTBlock node, Object data) { } public Object visit(ASTStmt node, Object data) { } public […]

访客模式解决方案:很少访问者具有相同的界面,但应该使用不同的对象

我有以下类图(访问者模式实现): 预期结果: 1)WiredVisitor应该只访问Router和WiredNetworkCard 2)WirelessVisitor只能访问Router和WirelessNetworkCard 所以,我的问题是:我应该如何改变设计(或代码)以实现我的预期结果? PS我目前的解决方案是在两个访问者中为每次访问(卡:INetworkCard)方法添加以下代码: // in WiredVisitor if (card.getClass.equals(WiredNetworkCard.class)){ // do logic of visit method } // in WirelessVisitor if (card.getClass.equals(WirelessNetworkCard.class)){ // do logic of visit method }

双重调度如何在访客模式中工作?

我正在调查与访问者模式相关的其他问题,但无法理解访问者模式中双重调度的实现。 请参阅访问者模式链接 双重调度如何在访客模式中工作?