在日常开发中,总会有时候我们会需要使用枚举中的值去进行if判断,但由于多条件,所以我们可能想用switch..case来简化代码。但发现当我们使用枚举值时,idea会标红并提示:“Constant expression required”。
什么是 “Constant expression required” 呢,我们翻译一下就是说:必须是常数表达式。其实这个提示已经说的相当清楚了,在java中 switch..case 不支持非常数表达式。
java不支持的原因其实是2方面:效率和安全。
switch语句中可使用的值类型限制为byte、short、char、int或enum类型,Java语言设计人员能够确保编译器生成的字节码是高效且可预测的。这些类型都是基本类型或枚举,这意味着它们可以使用简单的相等性测试进行比较。这使得编译器很容易生成使用表切换或lookupswitch指令的高效字节码。
如果允许switch语句中的表达式为任何类型,编译器将不得不生成更复杂的字节码来处理switch语句中可能使用的不同类型的值。这将使字节码的效率更低,更难以预测,从而可能导致更慢的执行时间和更困难的调试。
所以:对Java中switch语句中可使用的值类型的限制旨在通过将可使用的值类型限制为可以使用简单的相等性测试进行比较的值类型,从而确保switch语句是高效和可预测的。
那这种问题如何解决呢,其实在上面已经说到了。switch只支持byte、short、char、int或enum类型。所以判断时需要使用枚举来判断,而非使用枚举具体的值表达示来判断。
通过获取枚举,并将枚举当做条件,即可解决枚举值问题