前言
亲爱的友友们,我们今天来看一下如何巧妙利用枚举来替代if语句
能实现功能的代码千篇一律,但优雅的代码万里挑一
业务背景
在coding中遇到一个需求,经过简化后就是:需要根据不同的code值,处理逻辑,然后返回对应的对象。
我就简答举个栗子哈💬
根据 不同的code,返回不同的对象
传1 返回 一个对象,包含属性:name、age ; 传2,返回一个对象,包含属性name ; 传3,返回一个对象,包含属性sex …
字段值默认为 test
思路
摇头版
public class TestEnum { public static void main(String[] args) { Integer code = 1;//这里为了简单,直接这么写的,实际情况一般是根据参数获取 JSONObject jsonObject = new JSONObject(); if(Objects.equals(0,code)){ jsonObject.fluentPut("name", "test").fluentPut("age", "test"); System.out.println("jsonObject = " + jsonObject); } if(Objects.equals(1, code)){ jsonObject.fluentPut("name", "test"); System.out.println("jsonObject = " + jsonObject); } if(Objects.equals(2,code)){ jsonObject.fluentPut("sex", "test"); System.out.println("jsonObject = " + jsonObject); } } }
上面的代码在功能上是没有问题滴,但是要扩展的话就💘,比如 当code为4时,ba la ba la,我们只有再去写一遍if语句,随着code的增加,if语句也会随之增加,后面的人接手你的代码时 💔
优雅版
我们首先定义一个枚举类,维护对应Code需要返回的字段
@Getter @AllArgsConstructor public enum DataEnum { /** * 枚举类 */ CODE1(1,new ArrayList<>(Arrays.asList("name","age"))), CODE2(2,new ArrayList<>(Arrays.asList("name"))), CODE3(3,new ArrayList<>(Arrays.asList("sex"))) ; private Integer code; private List<String> fields; //传入code 即可获取对应的 fields public static List<String> getFieldsByCode(Integer code){ DataEnum[] values = DataEnum.values(); for (DataEnum value : values) { if(Objects.equals(code, value.getCode())) { return value.getFields(); } } return null; } }
客户端代码
public class TestEnum { public static void main(String[] args) { //优雅版 JSONObject jsonObject = new JSONObject(); //传入code,获取fields List<String> fieldsByCode = DataEnum.getFieldsByCode(1); assert fieldsByCode != null; fieldsByCode.forEach(x->{ jsonObject.put(x,"test"); }); System.out.println(jsonObject); } }
实现的功能和上面的一样,但是我们发现TestEnum
代码里面一条if语句都没有也,这时,即使code增加了,我们也只需要维护枚举类里面的代码,压根不用在TestEnum
里面添加if语句,是不是很优雅😎
小总结
【Tips】我们在写代码时,一定要考虑代码的通用性
上面的案例中,第一个版本仅仅只是能实现功能,但是当发生变化时难以维护,代码里面有大量的if语句,看着也比较臃肿,后面的人来维护时,也只能不断的添加if语句,而第二个版本巧用枚举类的方法,用一个通用的获取fields的方法,我们的TestEnum
代码就变得相当优雅了😎
结语