使用Enum优雅替换if-else的实现

admin 2021-12-13 PM 1947℃ 0条

一、前言

很久就知道有一个替换多重if-else的办法,但一直没有尝试过。今天在写代码的时候也用到了多重if-else,然后凭着对Enum的理解写了一个替换操作,写完以后发现代码确实简洁很多,记录下来供大家参考。

二、实现要点

先看一下往常的if-else组合的情况,下面是常见的if-else组合示例代码(伪代码):

int type = x;
if(type == 1){
  print "a"
}else if(type == 2){
  print "b";
}else if(type==3){
  print "c";
}else{
...//more if-else
}

从上面的为代码中我们能够看到,一旦有新的条件加入,则需要在主逻辑上增加n多if-else分支。那么如何利用enum改造一下,让实现的方式更加优雅呢?

答案当然是肯定是,只需要遵循以下原则,则将会得到更加优雅的if-else实现办法。

  • 第一,将判断条件作为(第一顺位)参数给到枚举构造函数
  • 第二,使用静态函数轮询出枚举的具体值
  • 第三,使用具体值调用公共函数或者是私有实现函数

这是将if-else改造成enum实现的基本步骤

三、代码实现

根据上面的思路,我们将第二部分的if-else逻辑改造成enum,得到的示例代码如下:

public enum PrintText {
    //1-a、2-b、3-c、4-d、5 H5-e、10-h、11-i、12-j
    a(1, "a"),
    b(2, "b"),
    c(3, "c"),
    d(4, "d"),
    e(5, "e"),
    h(10, "h"),
    i(11, "i"),
    j(10, "j");

    int val;
    String text;

    TriggerModeText(int i, String s) {
        val= i;
        text = s;
    }

    public static String getText(int val) {
        for (PrintText p: values()) {
            if (val== p.val) {
                return p.text;
            }
        }
        return "null";
    }
}

在代码中的引用方式为:

String s = PrintText.getText(1);

当然,我们有时候会在if-else立面做一些函数类型的操作,这个时候可以每个enum的值里面添加个性函数,上面的enum代码可以改写成以下示例:

public enum PrintText {
    //1-a、2-b、3-c、4-d、5 H5-e、10-h、11-i、12-j
    a(1){void print(){print "a"}},
    b(2){void print(){print "b"}};

    public static PrintText getPt(int val) {
        for (PrintText p: values()) {
            if (val== p.val) {
                return p;
            }
        }
        return null;
    }
   

同样的,我们在代码中可以使用下面的代码进行引用:

PrintText.getPt(1).print();

四、总结

使用enum替代if-else,只是代码重构的一个方法,并不会减低代码量,但是相对于if-else的实现,这种实现方法比较优雅,确实也最大限度减少if-else的使用数量。

标签: enum-if-else

非特殊说明,本博所有文章均为博主原创。

评论已关闭