用enum代替if.这个设计大家怎么看

本文分享了一次重构经历,将if-else逻辑替换为枚举处理,提高了代码可读性和扩展性。这种做法减少了重复代码,使得新增流程更加简便。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

十一闲来无事到公司改了段代码,大家看看这个修改适合不。首先放出修改前的原始的代码(经过简化,改了名字,名字随便改的),逻辑很简单,就是前端传一个参数进来,后台根据参数的不同进行不同的逻辑处理。

public class HandleSomething {

private Manager manager;

private Logger subLogger = LoggerFactory.getLogger(this.getClass());

/**
* entryType ,进入的参数,根据该参数来判断逻辑。
*
*/
public static final int VIP_ENTRY_FLOW = 1; // 特殊页面进入

public static final int INDEX_ENTRY_FLOW = 2; // 首页进入

public static final int OTHERS_ENTRY_FLOW = 3; // 其他页面进来

protected void work( int entryType, long userId,Context context) {

if (entryType == VIP_ENTRY_FLOW) {
context.put("type", vipFlow(userId,context));
return;
}
if (entryType == INDEX_ENTRY_FLOW) {
context.put("type", indexFlow(userId, context));
return;
}
if (entryType == OTHERS_ENTRY_FLOW) {
context.put("type", othersFlow(userId,context));
}
}

private int vipFlow(long userId, TemplateContext context) {/*这里的逻辑用到manager和subLogger*/}
private int indexFlow(long userId, TemplateContext context) {/*这里的逻辑用到manager和subLogger*/}
private int othersFlow(long userId, TemplateContext context) {/*这里的逻辑用到manager和subLogger*/}
}


修改后:

public class HandleSomething {

private static Manager manager;

private static Logger subLogger = LoggerFactory.getLogger(HandleSomething.class);

protected void work( int entryType, long userId,Context context) {
for (Flow flow : Flow.values()) {
if (flow.getTag() == entryType) {
context.put("type", flow.handle(userId, context));
break;
}
}

}

enum Flow{
VIP_ENTRY_FLOW(1) {// 特殊页面进入
@Override
int handle(long userId, TemplateContext context) {
/*这里的逻辑用到manager和subLogger*/
},

TAOJINBI_ENTRY_FLOW(2) {// 首页进入
@Override
int handle(long userId, TemplateContext context) {
/*这里的逻辑用到manager和subLogger*/
},
ADD_TAOJINBI(3){ // 其他页面进来
@Override
int handle(long userId, TemplateContext context) {
/*这里的逻辑用到manager和subLogger*/
}
};
private final int tag;

Flow(Integer tag){
this.tag=tag;
}
public int getTag() {
return tag;
}

public abstract int handle(long userId, Context context);
}
}




修改后通过使用枚举类型间接地去掉了if.

我觉得修改之后有以下特点:
优点:1.execute方法的代码更简洁并且减少重复代码
2.如果要增加新的处理流程只需要在枚举类中增加一个参数类型即可,不用修改execute方法

但是我有个问题:不清楚这样写是否会带来其他问题。例如性能问题和内存问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值