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;
}