说明
使用枚举 + SpringBeanUtil 实现对类型的实现进行一个代码归档。方便维护与排查问题。
场景
在项目中, 总会遇到很多计算规则的内容,或者校验规则。这时候我们的实现方式可能会将创建一个规则类,将所有的规则都放在这个类里面。或者规则包,对规则进行归档,然后放在这个规则包中。但是在阅读的时候,就会比较麻烦。这里提供一个使用枚举进行归档的方式。
1.枚举
import cn.hutool.extra.spring.SpringUtil;
import com.cah.project.test.service.AddCalcService;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.math.BigDecimal;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Stream;
/**
* 功能描述: 计算枚举 <br/>
*/
@Getter
@AllArgsConstructor
public enum CalculateEnum {
ADD("求和", list -> SpringUtil.getBean(AddCalcService.class).calc(list)),
MAX("最大", list -> list.stream().max(BigDecimal::compareTo).orElse(null)),
MIN("最小", list -> list.stream().min(BigDecimal::compareTo).orElse(null)),
OTHER("其他", list -> {
System.out.println("自定义计算规则");
return list.get(0).add(list.get(1));
}),
;
private final String deac;
private final Function<List<BigDecimal>, BigDecimal> func;
public static BigDecimal calculate(String type, List<BigDecimal> datas) {
CalculateEnum ce = Stream.of(values()).filter(e -> e.name().equalsIgnoreCase(type)).findFirst().orElseThrow(NullPointerException::new);
return ce.getFunc().apply(datas);
}
public BigDecimal calculate(List<BigDecimal> datas) {
return getFunc().apply(datas);
}
}
2.计算服务
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.List;
//@Component
@Service
public class AddCalcService {
// 注入其他的服务,服务之间调用
public BigDecimal calc(List<BigDecimal> list) {
return list.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
}
}
3.测试类
import cn.hutool.core.collection.ListUtil;
import com.cah.project.WebApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.math.BigDecimal;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = WebApplication.class)
public class CalculateEnumTest {
@Test
public void test() {
List<BigDecimal> datas = ListUtil.toList(BigDecimal.ONE, new BigDecimal(2), new BigDecimal(3));
System.out.println(CalculateEnum.calculate("add", datas));
System.out.println(CalculateEnum.calculate("Max", datas));
System.out.println(CalculateEnum.calculate("MIN", datas));
System.out.println(CalculateEnum.calculate("other", datas));
System.out.println(CalculateEnum.OTHER.calculate(datas));
}
}
4.结果
6
3
1
自定义计算规则
3
自定义计算规则
3
优点
1.可以对规则进行归档; 2.统一出入参; 3.通过spring的注入,完成复杂计算和实时数据计算
缺点
1.需要多编写一个枚举类 2.因为统一出入参,所以需要对现有的规则进行整体分析