需求:前端入参不同的type类型,后端需要删除不用库中的记录。
普通的编码方式:
if (type.equals(api)) {
apiDao.deleteById(id)
} else if (type.equals(doc)) {
docDao.deleteById(id)
}
问题:代码不够优雅,想省去if else 分支
采用枚举类的方式
先看效果:
public void delRecordById(String id, String type) {
ElasticsearchRepository dao = CatalogTypeEnum.getDaoByType(type);
dao.deleteById(id);
}
我这里用的是 es 数据库,如果是 mybatis, 这里的 ElasticsearchRepository 可以替换成 mybatis-plus 中 BaseMapper 对象,原理都是一样的。
- 我们需要新建一个枚举类,列举出 type 和对应的 dao类。
@Getter
public enum CatalogTypeEnum {
API("api", ApiDao.class),
MD("md",DocDao .class)
;
private String type;
private Class<? extends ElasticsearchRepository> dao;
CatalogTypeEnum(String type, Class<? extends ElasticsearchRepository> dao) {
this.type = type;
this.dao = dao;
}
// 这里是关键代码
public static ElasticsearchRepository getDaoByType(String type) {
for (CatalogTypeEnum value :CatalogTypeEnum.values()){
if (value.type.equals(type)) {
ApplicationContext context = SpringContext.getContext();
return context.getBean(value.getDao());
}
}
throw new runtimeException("类型错误");
}
public void setType(String type) {
this.type = type;
}
public void setDao(Class<? extends ElasticsearchRepository> dao) {
this.dao = dao;
}
- 通过 context 获取bean
@Component
public class SpringContext implements ApplicationContextAware {
@Getter
private static ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
context = applicationContext;
}
}