英文:
Avoid multiple if-else conditions for different enum values in Java
问题
我有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();
}
我考虑过使用switch,但它也没有太大区别,而且我需要根据某些参数在doA()内返回一个布尔值。
提前感谢。
英文:
I have 6 values in the enum and using 6 if-else is really a bad practice.
Can we implement this in any better way? Below is my scenario :
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();
}
I was thinking of switch, but is is not making much difference also i need to return a boolean value inside doA() depending on certain parameters.
Thanks in advance.
答案1
得分: 1
以下是您要翻译的内容:
一系列的else-if
语句
保留您的代码不变。难以阅读和编写。
Switch语句
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;
}
请注意,这是经典的switch
语句。如果您可以访问更新的Java版本,可能可以摆脱break
语句。
EnumMap
您还可以创建一个EnumMap
:
EnumMap<ExampleEnum, Runnable> enumMap = new EnumMap<>(Map.of(
ExampleEnum.A, Main::doA, // 'Main',或者您的do*方法所在的位置。
ExampleEnum.B, Main::doB,
ExampleEnum.C, Main::doC, // 我在使用方法引用。但您也可以使用Lambda表达式:'() -> doD()'。
ExampleEnum.D, Main::doD,
ExampleEnum.E, Main::doE,
ExampleEnum.F, Main::doF
));
ExampleEnum value = getEnumValue();
enumMap.get(value).run();
希望这对您有帮助!
英文:
You have a few options:
A chain of else-if
s
Leave your code as-is. Hard to read and write.
Switch
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;
}
Note that this is the classic switch. If you have access to newer Java versions, it is probably possible to get rid of the break
s.
EnumMap
You can also create an 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();
答案2
得分: 1
如果您想使用switch
语句,且您使用的是Java 12或更新版本,请考虑使用扩展的开关表达式,以避免break
语句的陷阱:
switch (value) {
case A -> doA();
case B -> doB();
case C -> doC();
case D -> doD();
case E -> doE();
case F -> doF();
}
英文:
If you want to use a switch
statement and you're on Java 12 or newer, consider using extended switch expressions that avoid the pitfalls of break
statements:
switch (value) {
case A -> doA();
case B -> doB();
case C -> doC();
case D -> doD();
case E -> doE();
case F -> doF();
}
答案3
得分: 0
你可以将 do
方法添加到枚举内部。
public enum ExampleEnum {
A {
public void doIt() { ... }
},
B {
public void doIt() { ... }
},
...
abstract public void doIt();
}
ExampleEnum value = getEnumValue();
if (value != null) {
value.doIt();
}
英文:
You can add the do method inside the enum.
public enum ExampleEnum {
A {
public void doIt() { ... }
},
B {
public void doIt() { ... }
},
...
abstract public void doIt();
}
ExampleEnum value = getEnumValue();
if (value != null) {
value.doIt();
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论