如何解决避免Java中不同枚举值的多个if-else条件 由else-if s组成的链切换 EnumMap
我在枚举中有6个值,使用6 if-else确实是一个不好的做法。 我们能否以更好的方式实现这一目标?以下是我的情况:
ExampleEnum value = getEnumValue();
if(ExampleEnum.A == value){
doA();
}else if(ExampleEnum.B == value){
doB();
}else if(ExampleEnum.C == value){
doC();
}else if(ExampleEnum.D == value){
doD();
}else if(ExampleEnum.E == value){
doE();
}else if(ExampleEnum.F == value){
doF();
}
我当时在考虑切换,但是并没有太大的区别,我还需要根据某些参数在doA()内部返回一个布尔值。
谢谢。
解决方法
您有几种选择:
由else-if
s组成的链
保持您的代码不变。很难读写。
切换
switch (value) {
case A:
doA();
break;
case B:
doB();
break;
case C:
doC();
break;
case D:
doD();
break;
case E:
doE();
break;
case F:
doF();
break;
}
请注意,这是经典开关。如果您有权使用Java的较新版本,则可能可以摆脱break
。
EnumMap
您还可以创建一个EnumMap
:
EnumMap<ExampleEnum,Runnable> enumMap = new EnumMap<>(Map.<ExampleEnum,Runnable>of(
ExampleEnum.A,Main::doA,// 'Main',or wherever your do* methods are.
ExampleEnum.B,Main::doB,ExampleEnum.C,Main::doC,// I'm using method references. But you could
ExampleEnum.D,Main::doD,// also use lambda expressions: '() -> doD()'.
ExampleEnum.E,Main::doE,ExampleEnum.F,Main::doF
));
ExampleEnum value = getEnumValue();
enumMap.get(value).run();
,
如果您想使用switch
语句并且使用Java 12或更高版本,请考虑使用extended switch expressions来避免break
语句的陷阱:
switch (value) {
case A -> doA();
case B -> doB();
case C -> doC();
case D -> doD();
case E -> doE();
case F -> doF();
}
,
您可以在枚举中添加do方法。
public enum ExampleEnum {
A {
public void doIt() { ... }
},B {
public void doIt() { ... }
},...
abstract public void doIt();
}
ExampleEnum value = getEnumValue();
if (value != null) {
value.doIt();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。