最近接触互联网项目,发现实际互联网项目中有非常多的判断,每次功能迭代,需求一旦变动,或者加个字段,代码就会加一行if else,不得不说if else效率是很高,但是给后期可维护性,可读性造成很大伤害,如果一连串的if else,几个版本迭代下来,其他开发接手,都不敢动,更别提重构,只好又在后面再加一个if else,这样恶性循环。
解决if else,可以用设计模式,比如策略模式;嵌套if else,可以用责任链模式,这些设计模式可能对于那些新手CRUD程序员有点挑战,所以我在这说一下最简单的用枚举解决过多的if else
@Test
public void areaFix(){
int value = 100;
if(0<value && value<=50){
System.out.println("优");
}else if(50<value && value <=100){
System.out.println("良");
}else if(100<value && value<=150){
System.out.println("轻度污染");
}else {
System.out.println("其他");
}
}
上面代码是一个简单的if判断,实际中可能比这个条件还要多。。
业务呢是比较value的值,判断它所在区间,打印对应的值,很简单。
如果我要判断151~200为重度污染,可能有的人就会在后面在加一个if。那枚举怎么解决呢?
public enum TypeEnum {
TYPE_YOU(0,50,"优"),
TYPE_LIANG(51,100,"良"),
TYPE_JIGE(101,150,"轻度污染"),
TYPE_OTHER(-1,-1,"其他");
private int begin;
private int end;
private String value;
TypeEnum(int begin,int end, String value) {
this.value = value;
this.begin = begin;
this.end = end;
}
public static String getTarget(int value){
for (TypeEnum typeEnum:values()){
if (typeEnum.begin<=value && value<=typeEnum.end){
return typeEnum.value;
}
}
return TYPE_OTHER.value;
}
}
定义一个枚举类,实际判断区间的方法把他改为静态方法
for是遍历枚举下的所有条件,然后再判断所在区间。
实际调用的时候既可以直接调用静态方法
@Test
public void areaFix2(){
int value = 1000;
String target = TypeEnum.getTarget(value);
System.out.println(target);
}
这样一行代码就可以解决过多的if else,而且扩展性极强,我要加151~200为重度污染,只需要在枚举类加入
TYPE_YOU(0,50,"优"),
TYPE_LIANG(51,100,"良"),
TYPE_JIGE(101,150,"轻度污染"),
TYPE_ZHONGDU(151,200,"重度污染"),
TYPE_OTHER(-1,-1,"其他");
有其他条件再加即可,关键的业务代码不需要改动,是不是很方便?
这里注意的是TYPE_YOU(0,50,"优"),里面所用的值是和枚举的构造方法对应的,数据类型要对应。
TypeEnum(int begin,int end, String value) {
this.value = value;
this.begin = begin;
this.end = end;
}
还有一种复杂写法,给枚举自定义方法实现,代码如下
public enum Area {
AREA_0_50(0, 50){
@Override
public String handle() {
return "优";
}
},
AREA_51_100(51,100){
@Override
public String handle() {
return "良";
}
},
AREA_101_150(101,150){
@Override
public String handle() {
return "轻度污染";
}
},
AREA_OTHER(-1,-1){
@Override
public String handle() {
return "其他";
}
};
private int beginpoint;
private int endpoint;
Area(int beginpoint, int endpoint) {
this.beginpoint = beginpoint;
this.endpoint = endpoint;
}
public abstract String handle();
public static String getTarget(int value){
for (Area areaEnum:values()){
if (areaEnum.beginpoint<=value && value<=areaEnum.endpoint){
return areaEnum.handle();
}
}
return AREA_OTHER.handle();
}
}
具体调用的话还是一样的
@Test
public void areaFix3(){
int value = 51;
String target = Area.getTarget(value);
System.out.println(target);
}
这样的话,你可以在枚举的自定义方法中写更复杂的操作,
代码很简单,重要的是学思想
end