当前位置: 首页 > 知识库问答 >
问题:

避免Java中不同枚举值的多if-else条件

柴声
2023-03-14

我在枚举中有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()内返回一个布尔值。

提前谢谢。

共有3个答案

冷涵忍
2023-03-14

可以在枚举内添加do方法。

public enum ExampleEnum {
    A {
        public void doIt() { ... }
    },
    B {
        public void doIt() { ... }
    },
    ...

    abstract public void doIt();

}

ExampleEnum value = getEnumValue();
if (value != null) {
    value.doIt();
}
熊博远
2023-03-14

如果您想使用开关语句,并且您在Java12或更新版本,请考虑使用扩展开关表达式来避免中断语句的陷阱:

java prettyprint-override">switch (value) {
    case A -> doA();
    case B -> doB();
    case C -> doC();
    case D -> doD();
    case E -> doE();
    case F -> doF();
}
梁华皓
2023-03-14

您有几个选择:

保持代码不变。读写困难。

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版本,则可能可以摆脱中断s。

您还可以创建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();

 类似资料:
  • 我读过很多关于代码重构和避免if-else语句的主题。实际上,我有一个类,我使用了很多if-else条件。 更多细节:我正在使用pull解析器,在soap响应的每一行,我会检查是否有我感兴趣的标签,如果没有,请检查另一个标签等: 现在,我想用别的东西,而不是那些if else条件,但我不知道是什么。 你能给我举个例子吗?

  • 在我的程序中,我需要检查变量是否等于1、2或3,并根据结果执行不同的方法: 这段代码非常简单和基本,但我真的不喜欢它。当然,我可以使用开关条件,但以我的拙见,它只会以不同的方式显示相同的基本功能。 我的问题是:有没有一种优雅的、可扩展的方式来实现功能? 仅供参考,我已经红了这篇文章,但我没有找到适合我问题的答案。

  • 问题内容: 我没有真正的运气可以通过使用Google来获得这种比较的简洁答案,我想先问一下,而不是自己进行耗时的评估。 我相当确定使用Enums的switch语句将比if-then-else语句执行得更快,尽管是否存在显着差异是另一个问题。 有人可以帮我一下吗? 感谢大家的快速反应,我会在以后的项目中牢记这一点。 问题答案: 是的,是的,因为一般而言,switch语句的运行速度比if / else

  • 我目前正在了解React Native中的if-else if-else语句的语法。下面是我理解的一个简单的if-else条件: 但是,当添加另一个条件来生成if-else if-else语句时,我遇到了问题。 如果有人能指出我的缺点,我将不胜感激!

  • 问题内容: 我有一个枚举的类对象(我有一个),我需要获取此枚举表示的枚举值的列表。该静态函数有我需要什么,但我不知道怎么去从类对象访问它。 问题答案:

  • Go语言的条件判断结构也很简单。 package main import "fmt" func main() { // 基本的例子 if 7%2 == 0 { fmt.Println("7 is even") } else { fmt.Println("7 is odd") } // 只有if条件的情况 if 8%4