枚举类使用案例

一、ICsCommonEnum公共接口

/**
 * @description 通用枚举公共类
 */
public interface ICsCommonEnum {
    /**
     * 统一定义基础code码
     * @return
     */
    String getCode();
}    

二、ErrorCodeEnum枚举类

import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;

/**
 * @description: 短信错误枚举类
*/
public class ErrorCodeEnum {

    @Getter
    @AllArgsConstructor
    public enum MessageErrorCodeEnum implements ICsCommonEnum{

        SUCCESS("0", "成功返回"),
        SYSTEM_BUSY("100", "系统忙(因平台侧原因,暂时无法处理提交的短信)"),
        NO_SMS_ACCOUNT("101", "无此短信账号/短信账号未登陆"),
        NO_INTERFACE_PERMISSION("199", "无此类型接口权限");
        private String code;
        private String message;
        /**
         *获取具体枚举类型
         */
        public static MessageErrorCodeEnum getCodeEnum(String code){
            final ErrorCodeEnum.MessageErrorCodeEnum codeEnum = Arrays.stream(values()).filter(v -> v.getCode().equals(code)).findFirst().orElse(null);
            return codeEnum;
        }
    }

    /**
     * 获取对应的状态码
     * @param code
     * @return
     */
    public static String  getMessage(String code){
        if(instance.isEmpty()){
            Arrays.stream(values()).forEach(v->{
                instance.put(v.getCode(),v.getMessage());
            });
            /*或者
			Arrays.stream(MessageErrorCodeEnum.values()).forEach(v->{
                instance.put(v.getCode(),v.getMessage());
            });
			*/
        }
        return instance.get(code);
    }

    @Getter
    @AllArgsConstructor
    public enum TaskStatusEnum{
        ENABLE(true,"启用"),
        DISABLE(false,"不启用")
        ;
        private boolean status;
        private String message;
    }
}

三、测试

@SpringBootTest
public class CsServiceApplicationTests {
    @Test
    void test5(){
        ErrorCodeEnum.MessageErrorCodeEnum codeEnum =  ErrorCodeEnum.MessageErrorCodeEnum.getCodeEnum("118");
        System.out.println(codeEnum);
    }
}

四、项目中实际使用

场景:根据返回CsPushScheduleTaskResp数据,对任务状态status和推送状态pushStatus的结果,进行判断最终的任务推送状态scheduleTaskPushStatus。
在这里插入图片描述
CsPushScheduleTaskResp

@Data
public class CsPushScheduleTaskResp implements Serializable {
    @ApiModelProperty("定时任务id")
    private Long id;

    @ApiModelProperty("预定推送时间")
    private Date pushTime;

    @ApiModelProperty("推送状态")
    private Integer pushStatus;

    @ApiModelProperty("任务名称")
    private String pushTaskName;

    @ApiModelProperty("推送对象")
    private String pushObject;

    @ApiModelProperty("推送模板名称")
    private String templateName;

    @ApiModelProperty("推送用户数")
    private Long pushUserNums;

    @ApiModelProperty("送达用户数量")
    private Long deliveryUseNums;

    @ApiModelProperty("状态")
    private Integer status;

    @ApiModelProperty("任务推送状态")
    private int scheduleTaskPushStatus;

    public int getScheduleTaskPushStatus() {
        final Integer taskStatus = SchedulerTaskPushStatusEnum.getTaskStatus(this.getStatus());
        final Integer taskPushStatus = SchedulerTaskPushStatusEnum.getPushStatus(this.getPushStatus());
        this.scheduleTaskPushStatus = !Objects.isNull(taskStatus) ? taskStatus : taskPushStatus ;
        return this.scheduleTaskPushStatus ;
    }
}

PushTaskEnum

public class PushTaskEnum {
@Getter
    @AllArgsConstructor
    public enum SchedulerTaskPushStatusEnum{
        TO_BE_SENT(0,"待发送",TaskPushStatusEnum.TO_BE_SENT.getStatus(),null),
        SENT(1,"已发送",TaskPushStatusEnum.SENT.getStatus(), null),
        SENDING(1,"发送中",TaskPushStatusEnum.SENDING.getStatus(), null),
        HAS_WITHDRAW(2,"已撤回",null,null),
        DISABLED(3,"已作废",null,TaskStatusEnum.ABANDONED.getStatus()),
        FAIL(4,"任务执行失败",TaskPushStatusEnum.FAIL.getStatus(), null)
        ;
        private Integer status;
        private String message;
        private Integer pushStatus;
        private Integer taskStatus;

        public static Map<Integer,Integer> pushStatusMap = new HashMap<>();
        public static Map<Integer,Integer> taskStatusMap = new HashMap<>();

        static{
            Arrays.stream(values()).forEach(v->{
                if(!Objects.isNull(v.getPushStatus())){
                    pushStatusMap.put(v.getPushStatus(),v.getStatus());
                }
                if(!Objects.isNull(v.getTaskStatus())){
                    taskStatusMap.put(v.getTaskStatus(),v.getStatus());
                }
            });
        }

        public static  Integer getPushStatus(int code){
           return pushStatusMap.get(code);
        }

        public static  Integer getTaskStatus(int code){
            return taskStatusMap.get(code);
        }
    }
}

在这里插入图片描述
getScheduleTaskPage

public PagingResult<CsPushScheduleTaskResp> getScheduleTaskPage(CsScheduleTaskPageReq req) throws Exception {
        CsPushScheduleTaskReq serviceReq = BeanCopyUtils.copyProperties(CsPushScheduleTaskReq.class,req);
        Integer pushStatus = null;
        if(!Objects.isNull(pushStatus = req.getPushStatus())){
            Integer finalPushStatus = pushStatus;
            List<Integer> taskStatus = new ArrayList<>();
            List<Integer> taskPushStatus = new ArrayList<>();
            //根据搜索框中推送状态码,反推枚举类中对应的状态码
            Arrays.stream(PushTaskEnum.SchedulerTaskPushStatusEnum.values()).forEach(v->{
                if(v.getStatus().equals(finalPushStatus)){
                    if(!Objects.isNull(v.getTaskStatus())){
                        taskStatus.add(v.getTaskStatus());
                    }
                    if(!Objects.isNull(v.getPushStatus())){
                        taskPushStatus.add(v.getPushStatus());
                    }
                }
            });
            serviceReq.setStatus(taskStatus);
            serviceReq.setPushStatus(taskPushStatus);
        }
        final Response<PagingResult<CsPushScheduleTaskResp>> resp = csPushTaskClient.getScheduleTaskPage(serviceReq);
        if(resp.fail()){
            ExceptionUtils.create(resp);
        }
        return resp.getResult();
    }

CsPushTaskMapper.xml

<select id="pageScheduleList"
            resultType="com.xxx.service.api.response.CsPushScheduleTaskResp">
        SELECT
            a.id,
            a.push_task_name ,
            b.name AS pushObject,
            a.push_time,
            a.push_status,
            a.push_time,
            a.del_flag,
            a.status,
            (SELECT d.name FROM cms_message_template AS d WHERE d.id=a.template_id) AS template_name,
            b.personnel_number AS push_user_nums
        FROM cs_push_task a
        LEFT JOIN  cms_user_group AS b ON a.user_group_id=b.group_id
        where
            a.del_flag = 0 and a.user_group_type = '0' AND a.push_type = '1'
            <if test="entity.search !=null and entity.search != ''">
                <bind name="search" value="'%'+entity.search+'%'"/>
                and (a.push_task_name like #{search} or b.name like #{search})
            </if>
            <if test="entity.pushStatus != null and entity.pushStatus.size > 0">
                and a.status !=0
                and a.push_status in
                <foreach collection="entity.pushStatus" item="item" open="(" separator="," close=")">
                    #{item}
                </foreach>
            </if>
            <if test="entity.status != null and entity.status.size > 0">
                and a.status in
                <foreach collection="entity.status" item="item" open="(" separator="," close=")">
                    #{item}
                </foreach>
            </if>
        order by a.id desc
    </select>
### Java枚举类型的定义与使用 #### 定义枚举类型 在 Java 中,可以通过 `enum` 关键字来定义枚举类型。枚举本质上是一个特殊的类,它继承自 `java.lang.Enum` 类[^2]。以下是定义枚举类型的语法: ```java public enum Color { RED, GREEN, BLUE; } ``` 上述代码中,`Color` 是一个枚举类型,包含了三个常量:`RED`, `GREEN`, 和 `BLUE`。 如果需要为枚举类型添加额外的功能,则可以在枚举值之后定义字段、构造函数和方法。需要注意的是,任何变量或方法的声明都必须位于所有枚举值定义之后[^3]。 以下是一个更复杂的例子,展示了如何为枚举类型添加属性和行为: ```java public enum Planet { MERCURY(3.30E23), VENUS(4.87E24), EARTH(5.98E24); private final double mass; // 构造函数 Planet(double mass) { this.mass = mass; } public double getMass() { return mass; } } ``` 在这个例子中,`Planet` 枚举不仅定义了几个行星名称作为常量,还为其赋予了一个质量属性,并提供了一个获取该属性的方法。 --- #### 使用枚举类型 一旦定义好枚举类型,就可以像其他对象一样对其进行操作。下面是一些常见的用法示例: ##### 获取枚举实例 可以直接通过枚举名访问其具体实例: ```java Color color = Color.RED; System.out.println(color); // 输出: RED ``` ##### 判断相等性 可以使用 `==` 或者 `.equals()` 方法判断两个枚举实例是否相同: ```java if (color == Color.GREEN) { System.out.println("The color is green."); } else { System.out.println("Not green."); } ``` ##### 遍历枚举项 利用 `values()` 方法可以获得当前枚举的所有可能取值列表: ```java for (Color c : Color.values()) { System.out.println(c); } // 输出: // RED // GREEN // BLUE ``` ##### 调用枚举中的方法 对于带有方法的复杂枚举,可以直接调用这些方法: ```java double earthMass = Planet.EARTH.getMass(); System.out.println("Earth's mass: " + earthMass); ``` --- #### 枚举类型的注意事项 1. **线程安全性**:由于枚举的每个实例都是单例模式实现的一部分,在多线程环境下非常安全[^1]。 2. **不可变性**:默认情况下,枚举是不可变的对象,因此适合用于表示固定集合的数据集。 3. **扩展限制**:尽管技术上允许子类化某些功能,但通常不建议这样做,因为这违背了设计初衷——即保持简单性和一致性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值