Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.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 枚举==vs开关(一项)_Java_Performance_Enums_Conventions - Fatal编程技术网

Java 枚举==vs开关(一项)

Java 枚举==vs开关(一项),java,performance,enums,conventions,Java,Performance,Enums,Conventions,注意:我正在做一些事情来测试这个,我只是想在我开始之前看看其他人是否有答案是个好主意 假设需要实现以下接口方法(其中枚举中的操作) 很明显,如果类支持多个操作,您将使用开关,如果类根本不支持操作,则返回false。我的问题是: 如果类只支持一种类型的操作,那么实现类似return op==Operation.SomeOperation的方法或使用类似以下内容会更好和/或更快: switch (op){ case SomeOperation: return true;

注意:我正在做一些事情来测试这个,我只是想在我开始之前看看其他人是否有答案是个好主意

假设需要实现以下接口方法(其中
枚举中的
操作

很明显,如果类支持多个操作,您将使用开关,如果类根本不支持操作,则返回false。我的问题是:

如果类只支持一种类型的
操作
,那么实现类似
return op==Operation.SomeOperation
的方法或使用类似以下内容会更好和/或更快:

switch (op){
    case SomeOperation:
        return true;
    default:
        return false;
}

我确实注意到,当给定
null
时,第一个返回false,第二个抛出
NullPointerException

更好的是意见,但更快的回答:它们将完全相同。编译器完全有能力进行这种琐碎的优化(JIT获得了第二次机会进行更多的优化)。你应该把时间花在更有效率的事情上(比如执行你的操作)


另外,如果你还想进一步探讨这个话题(很好),我建议你至少看一看,玩一玩。

我更喜欢第一种方法。您可以始终使用
if
语句,而不是
switch
(我也更喜欢这样)。小心过早优化永远不要为性能考虑选择特定的语法或模式,除非您已经通过测量证明您确实存在性能问题,并且所选的变体确实解决了这一问题。否则,请使用最能表达您意图的版本。最具可读性的是什么?第一点显然更重要。如果您必须支持多个操作,那么开关的可读性仍然远远低于
返回支持的_操作。contains(op),其中支持的_操作将是一个常量,初始化为
Collections.unmodifiableSet(EnumSet.of(Operation.OP1,Operation.OP1,Operation.OP1))
。这就是为什么我在试图找出它的时候问这个问题。谢谢大家!!
switch (op){
    case SomeOperation:
        return true;
    default:
        return false;
}