使用Enum优雅替换if-else的实现
一、前言
很久就知道有一个替换多重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的使用数量。