Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java枚举-切换语句与枚举上的访问者模式-性能优势?_Java_Enums_Performance_Switch Statement_Visitor Pattern - Fatal编程技术网

Java枚举-切换语句与枚举上的访问者模式-性能优势?

Java枚举-切换语句与枚举上的访问者模式-性能优势?,java,enums,performance,switch-statement,visitor-pattern,Java,Enums,Performance,Switch Statement,Visitor Pattern,我已经搜索了几天,想找到这个基于性能的问题的答案。 在深入研究了Internet之后,我了解到有几种方法可以在java中使用Enum,这些方法在。 当然,作为初学者,您肯定希望在switch case语句中使用enum,这可以提供对代码的清晰性和更好的理解。但另一方面,我们也有一个访问者模式风格的枚举实现,它确保了类型安全性和可扩展性 话虽如此,回到这个问题背后的原始想法,到目前为止,我已经了解到,如果使用Enum正确地设计了一个switch case构造,它可以确保case值不是稀疏的,并且E

我已经搜索了几天,想找到这个基于性能的问题的答案。
在深入研究了Internet之后,我了解到有几种方法可以在java中使用Enum,这些方法在。 当然,作为初学者,您肯定希望在switch case语句中使用enum,这可以提供对代码的清晰性和更好的理解。但另一方面,我们也有一个访问者模式风格的枚举实现,它确保了类型安全性和可扩展性

话虽如此,回到这个问题背后的原始想法,到目前为止,我已经了解到,如果使用Enum正确地设计了一个switch case构造,它可以确保case值不是稀疏的,并且Enum声明与switch case语句位于同一个编译单元中,java编译器对生成的字节码进行了一些优化,实现了一个跳转表(在Sun的网站和其他地方进行了讨论,我丢失了链接)。现在,与多个/嵌套if-else构造相比,这无疑提高了性能

我的问题是,java如何在生成的字节码中实现基于访问者模式的枚举实现,与基于开关大小写的实现(如果有的话)相比,性能提升了多少

考虑到我的枚举数在未来可能会增长,并且我也对性能很感兴趣,我应该选择哪种类型的实现。目前,我的枚举中有大约19个奇数常量


编辑
我有一个类,它存储了一些关于游戏变量的信息。变量之一是枚举类型

}

后来我意识到将信息与逻辑分离,因此创建了另一个类,并将枚举形状游戏对象移动到这个新类GraphicModel,而不是在那里设置开关盒,我实现了常量特定方法。是的,在这次修改之后,我在这两个类中都放了正确的导入语句

public class GraphicModel {
    public void drawGraphicFromObject(GameObject gameObject) {
        gameObject.getShape().draw();
    }

    public static enum Shape {
        // This method is not public, instead is only called by GraphicModel
        abstract void draw();

        SHAPE1 {
            @Override
            void draw() {
                // some transformations
            }
        },
        SHAPE2 {
            @Override
            void draw() {
                // Some different transformation
            }
        },
        SHAPE3 {
            @Override
            void draw() {
                // Yet another transform
            }
        },
        .
        .
        .
        .
        UNKNOWN {
            @Override
            void draw() {
                // 
            }
        };
    }
}
后来,我甚至根据建议的访问者模式实现了这一点

所以,我需要知道的是,哪种实施方式更有效?当然,为了在编译时将switch case转换为跳转表,java需要在同一编译单元中同时使用enum声明和switch语句。 我应该在我的GraphicModel类中使用基于开关的实现还是特定于常量的方法实现?
更确切地说,性能上的区别是什么

一般来说,如果在switch语句()中使用,枚举在性能上与int常量相当

也许你应该考虑沿着特定的具体方法实现的一些东西?e、 g

然后使用

getMode().color();
而不是switch语句

然而,我认为对于“只获取颜色的情况”,可能根本不需要方法


总的来说,我强烈推荐你的书架。第6章将讨论枚举和注释。

您是否有一个编写得最清晰的代码示例,以及一个说明它如何不符合规范的规范和测试结果?如果不是,你不应该按照这些思路思考。如果是这样的话,发布清晰的代码,我打赌我们可以找到一些更重要的优化“枚举的访问者模式实现”。我想如果你能告诉我你想解决的问题是什么,那就更好了。一旦你看到枚举可以用来解决你的问题,那么你就可以看到它是否需要优化。这听起来像是一种微优化,在99.99%的情况下没有明显的效果。如果我不能用正式的术语表达我的理解,我道歉,说实话,我从来没有掌握过这样的术语,虽然我一直在使用这种方法。我相信,是的,我在这里使用了错误的术语,就像Dieter在帖子中提到的,它被称为常量特定方法实现。我将发布我今天所说的示例代码。我发帖的时候是早上5点。谢谢大家的指点。我同意Matt的观点,但我的问题仍然存在,哪种方法更有效,即使它只带来了微小的提升?在《有效的Jave》第二版中,J.Bloch提出了一个令人信服的论点,即不应经常使用开关盒块来迭代枚举常量。他接着提出了这样一个想法,即使用特定于常量的方法代替switch-case通常可以生成更不脆弱、更易于维护的代码。将此推理应用到您的问题中,我想说性能问题不太重要(您必须分析才能看到),但恒定特定方法模式的软件工程优势有利于它们的使用,而不是切换案例。感谢您的建议,不过这正是我第二次做的。我还要看看这本书。
public enum Mode {

  ON { Color color() {return Color.GREEN;}},
  OFF { Color color() {return Color.RED;}},
  STANDBY { Color color() {return Color.YELLOW;}},
  DEFAULT { Color color() {return Color.BLACK;}};

  abstract Color color();

}//enum Mode
getMode().color();