Avoid multiple if-else conditions for different enum values in Java.

huangapple go评论72阅读模式
英文:

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-ifs

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 breaks.

EnumMap

You can also create an EnumMap:

EnumMap&lt;ExampleEnum, Runnable&gt; enumMap = new EnumMap&lt;&gt;(Map.&lt;ExampleEnum, Runnable&gt;of(
    ExampleEnum.A, Main::doA, // &#39;Main&#39;, or wherever your do* methods are.
    ExampleEnum.B, Main::doB,
    ExampleEnum.C, Main::doC, // I&#39;m using method references. But you could
    ExampleEnum.D, Main::doD, // also use lambda expressions: &#39;() -&gt; doD()&#39;.
    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 -&gt; doA();
    case B -&gt; doB();
    case C -&gt; doC();
    case D -&gt; doD();
    case E -&gt; doE();
    case F -&gt; 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();
}

huangapple
  • 本文由 发表于 2020年8月13日 17:44:42
  • 转载请务必保留本文链接:https://go.coder-hub.com/63392386.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定