枚举Enum解决if else过多问题

最近接触互联网项目,发现实际互联网项目中有非常多的判断,每次功能迭代,需求一旦变动,或者加个字段,代码就会加一行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

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容