java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java枚举通用接口实现

Java枚举通用接口设计与实现方法举例

作者:ᶻᶻᶻ 枕星河

在Java语言中枚举(Enum)是一种特殊的数据类型,用于定义固定的常量集合,它比常量更加灵活、强大,这篇文章主要介绍了Java枚举通用接口设计与实现方法的相关资料,需要的朋友可以参考下

前言

在Java开发中,枚举(Enum)是一种特殊的数据类型,用于定义固定的一组常量。在实际项目中,我们经常需要为枚举添加额外的属性和方法,如编码(code)和描述(description)。本文将介绍如何设计一个通用的枚举接口,让所有实现该接口的枚举都具备统一的操作方法。

一、设计思路

通过分析 GenderEnum、BaseEnumInterface 和 GenderEnumTest 三个文件,我们可以看到一个完整的枚举通用接口设计方案:

二、基础枚举接口设计

BaseEnumInterface 是整个设计的核心,它定义了枚举的基本行为和通用操作方法:

/**
 * @description 枚举基础接口
 */
public interface BaseEnumInterface<T> {

    /**
     * 获取枚举编码
     * @return 编码值
     */
    T getCode();

    /**
     * 获取枚举描述
     * @return 描述信息
     */
    String getDesc();

    /**
     * 根据 code 获取枚举实例(通用方法)
     * @param enumClass 枚举类
     * @param code 编码
     * @return 枚举实例
     * @param <E> 枚举类型
     * @param <T> 编码类型
     */
    static <E extends Enum<E> & BaseEnumInterface<T>, T> E fromCode(Class<E> enumClass, T code) {
        for (E e : enumClass.getEnumConstants()) {
            if (e.getCode().equals(code)) {
                return e;
            }
        }
        return null;
    }

    /**
     * 根据 code 获取枚举实例,如果找不到则返回默认值
     * @param enumClass 枚举类
     * @param code 编码
     * @param defaultEnum 默认枚举值
     * @return 枚举实例
     * @param <E> 枚举类型
     * @param <T> 编码类型
     */
    static <E extends Enum<E> & BaseEnumInterface<T>, T> E fromCodeOrDefault(Class<E> enumClass, T code, E defaultEnum) {
        E result = fromCode(enumClass, code);
        return result != null ? result : defaultEnum;
    }

    /**
     * 根据描述获取枚举实例
     * @param enumClass 枚举类
     * @param desc 描述
     * @return 枚举实例
     * @param <E> 枚举类型
     */
    static <E extends Enum<E> & BaseEnumInterface<?>> E fromDesc(Class<E> enumClass, String desc) {
        for (E e : enumClass.getEnumConstants()) {
            if (e.getDesc().equals(desc)) {
                return e;
            }
        }
        return null;
    }

    /**
     * 获取所有枚举的编码列表
     * @param enumClass 枚举类
     * @return 编码列表
     * @param <E> 枚举类型
     * @param <T> 编码类型
     */
    static <E extends Enum<E> & BaseEnumInterface<T>, T> List<T> getAllCodes(Class<E> enumClass) {
        return Arrays.stream(enumClass.getEnumConstants())
                .map(e -> ((BaseEnumInterface<T>) e).getCode())  // 修改此处
                .collect(Collectors.toList());
    }

    /**
     * 获取所有枚举的描述列表
     * @param enumClass 枚举类
     * @return 描述列表
     * @param <E> 枚举类型
     */
    static <E extends Enum<E> & BaseEnumInterface<?>> List<String> getAllDescs(Class<E> enumClass) {
        return Arrays.stream(enumClass.getEnumConstants())
                .map(e -> ((BaseEnumInterface<?>) e).getDesc())  // 修改此处
                .collect(Collectors.toList());
    }

    /**
     * 获取枚举编码到描述的映射
     * @param enumClass 枚举类
     * @return 编码到描述的映射
     * @param <E> 枚举类型
     * @param <T> 编码类型
     */
    static <E extends Enum<E> & BaseEnumInterface<T>, T> Map<T, String> getCodeToDescMap(Class<E> enumClass) {
        return Arrays.stream(enumClass.getEnumConstants())
                .collect(Collectors.toMap(
                        e -> ((BaseEnumInterface<T>) e).getCode(),  // 修改此处
                        e -> ((BaseEnumInterface<T>) e).getDesc()   // 修改此处
                ));
    }

    /**
     * 获取枚举描述到编码的映射
     * @param enumClass 枚举类
     * @return 描述到编码的映射
     * @param <E> 枚举类型
     * @param <T> 编码类型
     */
    static <E extends Enum<E> & BaseEnumInterface<T>, T> Map<String, T> getDescToCodeMap(Class<E> enumClass) {
        return Arrays.stream(enumClass.getEnumConstants())
                .collect(Collectors.toMap(
                        e -> ((BaseEnumInterface<T>) e).getDesc(),  // 修改此处
                        e -> ((BaseEnumInterface<T>) e).getCode()   // 修改此处
                ));
    }

    /**
     * 检查给定的编码是否有效
     * @param enumClass 枚举类
     * @param code 编码
     * @return 是否有效
     * @param <E> 枚举类型
     * @param <T> 编码类型
     */
    static <E extends Enum<E> & BaseEnumInterface<T>, T> boolean isValidCode(Class<E> enumClass, T code) {
        return fromCode(enumClass, code) != null;
    }

    /**
     * 获取枚举实例列表
     * @param enumClass 枚举类
     * @return 枚举实例列表
     * @param <E> 枚举类型
     */
    static <E extends Enum<E> & BaseEnumInterface<?>> List<E> getAllEnums(Class<E> enumClass) {
        return Arrays.asList(enumClass.getEnumConstants());
    }
}

接口使用了泛型设计,支持不同类型编码的枚举,提高了通用性。

三、枚举类实现

以 GenderEnum 为例,展示了如何实现基础接口:

/**
 * 性别枚举
 */
public enum GenderEnum implements BaseEnumInterface<Integer> {
    /**
     * 男性
     */
    MALE(1, "男"),
    
    /**
     * 女性
     */
    FEMALE(2, "女"),
    
    /**
     * 未知
     */
    UNKNOWN(0, "未知");

    private final Integer code;
    private final String desc;

    GenderEnum(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    @Override
    public Integer getCode() {
        return code;
    }

    @Override
    public String getDesc() {
        return desc;
    }
}

四、通用方法功能展示

通过 GenderEnumTest 可以看到接口提供的各种通用功能:

根据编码获取枚举实例

/**
 * 性别枚举测试类
 */
@Slf4j
@Component
public class GenderEnumTest {

    public static void main(String[] args) {

        log.info("=== 性别枚举测试 ===");

        // 1. 测试根据code获取枚举实例
        GenderEnum male = BaseEnumInterface.fromCode(GenderEnum.class, 1);
        log.info("code为1的枚举: {}", male);
        log.info("code为1的枚举描述: {}", male.getDesc());

        GenderEnum female = BaseEnumInterface.fromCode(GenderEnum.class, 2);
        log.info("code为2的枚举: {}", female);
        log.info("code为2的枚举描述: {}", female.getDesc());

        // 2. 测试根据code获取枚举实例(带默认值)
        GenderEnum defaultGender = BaseEnumInterface.fromCodeOrDefault(GenderEnum.class, 99, GenderEnum.UNKNOWN);
        log.info("code为99的枚举(默认值): {}", defaultGender);

        // 3. 测试根据描述获取枚举实例
        GenderEnum byDesc = BaseEnumInterface.fromDesc(GenderEnum.class, "男");
        log.info("描述为'男'的枚举: {}", byDesc);

        // 4. 测试获取所有枚举的编码列表
        List<Integer> allCodes = BaseEnumInterface.getAllCodes(GenderEnum.class);
        log.info("所有枚举编码: {}", allCodes);

        // 5. 测试获取所有枚举的描述列表
        List<String> allDescs = BaseEnumInterface.getAllDescs(GenderEnum.class);
        log.info("所有枚举描述: {}", allDescs);

        // 6. 测试获取编码到描述的映射
        Map<Integer, String> codeToDescMap = BaseEnumInterface.getCodeToDescMap(GenderEnum.class);
        log.info("编码到描述的映射: {}", codeToDescMap);

        // 7. 测试获取描述到编码的映射
        Map<String, Integer> descToCodeMap = BaseEnumInterface.getDescToCodeMap(GenderEnum.class);
        log.info("描述到编码的映射: {}", descToCodeMap);

        // 8. 测试检查编码是否有效
        boolean validCode1 = BaseEnumInterface.isValidCode(GenderEnum.class, 1);
        boolean validCode99 = BaseEnumInterface.isValidCode(GenderEnum.class, 99);
        log.info("编码1是否有效: {}", validCode1);
        log.info("编码99是否有效: {}", validCode99);

        // 9. 测试获取所有枚举实例
        List<GenderEnum> allEnums = BaseEnumInterface.getAllEnums(GenderEnum.class);
        log.info("所有枚举实例:");
        allEnums.forEach(e -> log.info("  {} - code: {}, desc: {}", e.name(), e.getCode(), e.getDesc()));
    }
}

五、调试结果

16:42:56.622 [main] INFO com.GenderEnumTest - === 性别枚举测试 ===
16:42:56.624 [main] INFO com.GenderEnumTest - code为1的枚举: MALE
16:42:56.624 [main] INFO com.GenderEnumTest - code为1的枚举描述: 男
16:42:56.624 [main] INFO com.GenderEnumTest - code为2的枚举: FEMALE
16:42:56.624 [main] INFO com.GenderEnumTest - code为2的枚举描述: 女
16:42:56.624 [main] INFO com.GenderEnumTest - code为99的枚举(默认值): UNKNOWN
16:42:56.624 [main] INFO com.GenderEnumTest - 描述为'男'的枚举: MALE
16:42:56.648 [main] INFO com.GenderEnumTest - 所有枚举编码: [1, 2, 0]
16:42:56.649 [main] INFO com.GenderEnumTest - 所有枚举描述: [男, 女, 未知]
16:42:56.649 [main] INFO com.GenderEnumTest - 编码到描述的映射: {0=未知, 1=男, 2=女}
16:42:56.649 [main] INFO com.GenderEnumTest - 描述到编码的映射: {女=2, 未知=0, 男=1}
16:42:56.651 [main] INFO com.GenderEnumTest - 编码1是否有效: true
16:42:56.651 [main] INFO com.GenderEnumTest - 编码99是否有效: false
16:42:56.651 [main] INFO com.GenderEnumTest - 所有枚举实例:
16:42:56.651 [main] INFO com.GenderEnumTest -   MALE - code: 1, desc: 男
16:42:56.651 [main] INFO com.GenderEnumTest -   FEMALE - code: 2, desc: 女
16:42:56.651 [main] INFO com.GenderEnumTest -   UNKNOWN - code: 0, desc: 未知

Process finished with exit code 0

六、总结设计优势

到此这篇关于Java枚举通用接口设计与实现方法的文章就介绍到这了,更多相关Java枚举通用接口实现内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文