策略枚举的用法五:枚举方法

说明

使用枚举 + 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.因为统一出入参,所以需要对现有的规则进行整体分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值