一份优秀的代码,是不应该出现大量的if-else的,所以要对if-else进行改进,比如说拆解成多个方法或者用switch-case代替,又或者根据实际场景,使用枚举类,本文就是第三种方法。枚举
HealthRecordPushUtil的getCron()
public String getCron(String params) {
String cycle = JSON.parseObject(params).getString(HmConst.PARAMS_CYCLE);
String type = JSON.parseObject(params).getString(HmConst.PARAMS_TYPE);
if (HmConst.PUSH_DEFAULT.equals(type)){
return "0 0 0 1 * ?";
} else if (HmConst.PUSH_PACKAGE.equals(type)) {
if (HmConst.CYCLE_TYPE_WEEK.equals(cycle)){
return "0 0 0 ? * MON";
} else if (HmConst.CYCLE_TYPE_MONTH.equals(cycle)) {
return "0 0 0 1 * ?";
} else if (HmConst.CYCLE_TYPE_QUARTER.equals(cycle)) {
return "0 0 0 1 4,7,10,1 ?";
} else if (HmConst.CYCLE_TYPE_YEAR.equals(cycle)) {
return "0 0 0 1 1 ? *";
}
}
return "0 0 9 * * ?";
}
一般这种比较多的if-else可以改成用枚举结合switch-case,或者进行改进,一个优秀的代码是不应该出现大量的if-else的
上面的代码改成以下形式
枚举类
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum HealthRecordPushCycleEnum {
/**
* 按周推送
*/
CYCLE_TYPE_WEEK("week", "周推送","0 0 0 ? * MON"),
/**
* 按月推送
*/
CYCLE_TYPE_MONTH("month", "月推送","0 0 0 1 * ?"),
/**
* 按季推送
*/
CYCLE_TYPE_QUARTER("quarter", "季推送","0 0 0 1 4,7,10,1 ?"),
/**
* 按年推送
*/
CYCLE_TYPE_YEAR("year", "年推送","0 0 0 1 1 ? *"),
/**
* 默认推送
*/
PUSH_DEFAULT("default", "默认推送","0 0 0 1 * ?"),
/**
* 按套餐推送
*/
PUSH_PACKAGE("package", "按套餐推送", ""),
;
private String name;
private String desc;
private String cycle;
public static HealthRecordPushCycleEnum getByType(String type, String cycle) {
if (PUSH_DEFAULT.name.equals(type)) {
return PUSH_DEFAULT;
} else {
for (HealthRecordPushCycleEnum anEnum : HealthRecordPushCycleEnum.values()) {
if (anEnum.getName().equals(cycle)) {
return anEnum;
}
}
}
return null;
}
}
原来的方法
public String getCron(String params) {
String cycle = JSON.parseObject(params).getString(HmConst.PARAMS_CYCLE);
String type = JSON.parseObject(params).getString(HmConst.PARAMS_TYPE);
HealthRecordPushCycleEnum anEnum = HealthRecordPushCycleEnum.getByType(type, cycle);
assert anEnum != null;
return anEnum.getCycle();
}