巧用枚举来干掉if-else,代码更优雅!
代码中大量的if else 无疑会让代码的可读性变差,版本迭代时发现代码可读性太差,写个demo 记录一下。
一、版本一(简单版)
1、创建执行逻辑枚举类
package com.example.dl.demo3; /** * @author D-L * @program: dl * @description: 创建执行逻辑枚举类 * @date 2021-01-15 14:02:43 */ public enum EnumOperator { APP { @Override public void apply(String name) { System.out.println("移动客户端处理逻辑"); } }, PC { @Override public void apply(String name) { System.out.println("pc端处理逻辑"); } }; public abstract void apply(String name); }
2、封装处理逻辑
package com.example.dl.demo3; /** * @author D-L * @program: dl * @description: 封装处理逻辑 * @date 2021-01-15 14:01:47 */ public class GeneralCalculator { public void calculate(String name ,EnumOperator operator) { operator.apply(name); } }
3、调用
public static void main(String[] args) { String name = "APP"; GeneralCalculator calculator = new GeneralCalculator(); EnumOperator operator = EnumOperator.valueOf(name); calculator.calculate(name ,operator); }
二、版本二(进阶版)
1、首先构建一个 GeneralChannelRule 基础规则抽象类,定义一个抽象方法apply(),不同的渠道都需要实现该抽象方法。
package com.example.dl.demo2; /** * @author D-L * @program: dl * @description: 首先构建一个 GeneralChannelRule 基础规则抽象类 * @date 2021-01-15 11:23:56 */ public abstract class GeneralChannelRule { public abstract void apply(String sign); }
2、实现具体的业务规则
package com.example.dl.demo2; /** * @author D-L * @program: dl * @description: App移动客户端 处理逻辑 * @date 2021-01-15 11:24:49 */ public class AppChannelRule extends GeneralChannelRule { @Override public void apply(String sign) { System.out.println("App移动客户端 处理逻辑"); } }
package com.example.dl.demo2; /** * @author D-L * @program: dl * @description: pc端 处理逻辑 * @date 2021-01-15 11:25:28 */ public class PcChannelRule extends GeneralChannelRule { @Override public void apply(String sign) { System.out.println("pc端 处理逻辑"); } }
3、枚举类,增加一个GeneralChannelRule属性,并且给对应渠道构建对应的GeneralChannelRule实现类,新增一个match() 匹配方法
package com.example.dl.demo2; /** * @author D-L * @program: dl * @description: 创建枚举类 * @date 2021-01-15 11:26:08 */ public enum ChannelRuleEnum { /** * APP 移动客户端 */ APP("APP",new AppChannelRule()), /** * PC 网页版 */ PC("PC",new PcChannelRule()), ; public String name; public GeneralChannelRule channel; ChannelRuleEnum(String name, GeneralChannelRule channel) { this.name = name; this.channel = channel; } //匹配 public static ChannelRuleEnum match(String name){ ChannelRuleEnum[] values = ChannelRuleEnum.values(); for (ChannelRuleEnum value : values) { if(value.name.equals(name)){ return value; } } return null; } public String getName() { return name; } public GeneralChannelRule getChannel() { return channel; } }
4、调用
public static void main(String[] args) {
String sign = "APP";
ChannelRuleEnum channelRule = ChannelRuleEnum.match(sign);
if(channelRule == null){
System.out.println("找不到该标识");
return;
}
GeneralChannelRule rule = channelRule.channel;
rule.apply(sign);
}
解析:通过使用枚举类,在枚举中将 key 与 规则具体实现进行绑定。
通过改变:可以减少if -else使得代码更加优雅 如果需要新增渠道,我们只需要在编写具体规则实现类并继承GeneralChannelRule抽象类,并在枚举类中新增的枚举,而不需要改动到原先的任何代码。这符合了开发封闭原则。