通用便捷字典枚举接口

February 10, 2025 / AcLi / 71阅读 / 0评论 / 分类: java

以下是我在若依中集成了mybatis plus后,对于mybatis plus对于枚举支持而封装出来的通用字典枚举接口。

相较于友好的字典枚举,项目中魔法值的难以维护和只有字典值无法获取字典描述的常量值来说,字典枚举是非常适合在项目中使用,能够更加清晰的维护和使用字典

通用字典枚举接口代码

package com.ruoyi.common.enums;

import com.baomidou.mybatisplus.annotation.IEnum;
import com.fasterxml.jackson.annotation.JsonValue;
import org.dromara.hutool.core.array.ArrayUtil;

import java.io.Serializable;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * 枚举基础接口
 *
 * @author liac
 * @date 2022/3/17 18:16
 */
public interface BaseEnum<T extends Serializable> extends IEnum<T> {

    /**
     * 描述
     *
     * @author liac
     * @date 2022/3/17 18:17
     * @return java.lang.String
     */
    @JsonValue
    default String getDesc() {
        return name();
    }
    /**
     * 枚举名称
     *
     * @author liac
     * @date 2022/7/19 15:34
     * @return java.lang.String
     */
    String name();

    /**
     * 比较value是否相同
     *
     * @param value 值
     * @author liac
     * @date 2023/12/21 17:22
     * @return boolean
     */
    default boolean isValue(T value) {
        return getValue().equals(value);
    }

    /**
     * 比较desc是否相同
     *
     * @param desc 描述
     * @author liac
     * @date 2023/12/21 18:24
     * @return boolean
     */
    default boolean isDesc(String desc) {
        return getDesc().equals(desc);
    }

    /**
     * 根据value获取枚举对象
     *
     * @param valuesFun 枚举集
     * @param value 值
     * @author liac
     * @date 2023/12/20 18:04
     * @return U
     */
    static <U extends BaseEnum<T>, T extends Serializable> U getByValue(Supplier<U[]> valuesFun, T value) {
        return Optional.ofNullable(valuesFun)
                .map(l -> get(l.get(), U::getValue, value))
                .orElse(null);
    }

    /**
     * 根据desc获取枚举对象
     *
     * @param valuesFun 枚举集
     * @param desc 描述
     * @author liac
     * @date 2023/12/20 18:05
     * @return U
     */
    static <U extends BaseEnum<T>, T extends Serializable> U getByDesc(Supplier<U[]> valuesFun, String desc) {
        return Optional.ofNullable(valuesFun)
                .map(l -> get(l.get(), U::getDesc, desc))
                .orElse(null);
    }

    /**
     * 根据value获取desc
     *
     * @param valuesFun 枚举集
     * @param value 值
     * @author liac
     * @date 2023/12/21 17:41
     * @return java.lang.String
     */
    static <U extends BaseEnum<T>, T extends Serializable> String getDescByValue(Supplier<U[]> valuesFun, T value) {
        U u = getByValue(valuesFun, value);
        return Optional.ofNullable(u)
                .map(U::getDesc)
                .orElse(null);
    }

    /**
     * 根据desc获取value
     *
     * @param valuesFun 枚举集
     * @param desc 描述
     * @author liac
     * @date 2023/12/21 17:41
     * @return R
     */
    static <U extends BaseEnum<T>, T extends Serializable> T getValueByDesc(Supplier<U[]> valuesFun, String desc) {
        U u = getByDesc(valuesFun, desc);
        return Optional.ofNullable(u)
                .map(U::getValue)
                .orElse(null);
    }

    /**
     * 根据function函数返回值匹配o值
     *
     * @param values
     * @param function
     * @param o
     * @author liac
     * @date 2023/12/20 18:01
     * @return U
     */
    static <U extends BaseEnum<T>, T extends Serializable, P extends Serializable> U get(U[] values, Function<U, P> function, P o) {
        if (ArrayUtil.isEmpty(values)) return null;
        for (U u : values) {
            if (Objects.equals(function.apply(u), o)) {
                return u;
            }
        }
        return null;
    }

}

使用示例

import com.ruoyi.common.enums.BaseEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public enum Sex implements BaseEnum<Integer> {

    MAN(1, "男"),
    WOMAN(2, "女")
    ;
    private final Integer value;
    private final String desc;

    public static void main(String[] args) {
        // 根据value值获取枚举值
        Sex man = BaseEnum.getByValue(Sex::values, 1);
        // 根据desc获取枚举值
        Sex woman = BaseEnum.getByDesc(Sex::values, "女");
        // 根据value获取desc
        String manDesc = BaseEnum.getDescByValue(Sex::values, 1);
        // 根据desc获取value
        Integer womanValue = BaseEnum.getValueByDesc(Sex::values, "女");
        // 判断value是否为该枚举的value
        boolean isMan = Sex.MAN.isValue(1);
        // 判断desc是否为该枚举的desc
        boolean isWoman = Sex.WOMAN.isDesc("女");
        // 根据枚举的某个值获取枚举值(该方法为以上方法的基础方法,不具备通用性)
        Sex sex = BaseEnum.get(Sex.values(), Sex::getValue, 1);
    }

}
#enum(1)

文章作者:AcLi

文章链接:https://liac.vip//archives/tong-yong-bian-jie-zi-dian-mei-ju-jie-kou

版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0 许可协议,转载请注明出处!

评论已关闭!