前言: 

由于刚转java项目,所以对于java语言比较陌生,尤其是lambda和一些诸如(一个java文件只能有一个public class)等等的零散知识点之类。。。

使我觉得就语言的层级来说。.net真的超越java不是一星半点。奈何.net跨平台晚,社区力量也小。

相交枚举而言。真的没有 .net中给枚举添加attrbuite来的方便。.net枚举:Enum 枚举值 (一) 获取描述信息_正怒月神的博客-CSDN博客_enum 获取

由于公司需要多语言,所以枚举中希望能增添额外的属性。
并且提供共同的操作方法。

下面给大家看一下java中的枚举操作方法的封装。(由于是java的菜鸡,所以将就着用)

先看一下文件结构

然后我们看一下各个文件:

一:EnumItem

封装了一些常用属性,属性命名很直白了,就不解释了

(这里key设置了泛型,是由于特殊情况不需要Integer类型)

package com.leadtrans.report.model.Enum;

/**
 * @author: Tyler
 * @createDate: 2021/12/8
 */


public class EnumItem<T> {

    private T key;
    private String val;

    public EnumItem(){}

    public T getKey() {
        return key;
    }

    public void setKey(T key) {
        this.key = key;
    }

    public String getVal() {
        return val;
    }

    public void setVal(String val) {
        this.val = val;
    }
}

二  EnumList 

存放枚举值,每个枚举都继承了IEnumList接口,并且重写了getEnumItem()方法。

不知道接口能不能通过 default来默认实现。大家可以尝试一下。

package com.leadtrans.report.model.Enum;

import io.swagger.annotations.ApiModelProperty;

/**
 * @author: Tyler
 * @createDate: 2021/12/8
 */


public class EnumList {
    public interface IEnumList {
        EnumItem getEnumItem();
    }

    //report
    public enum ReportEnum implements IEnumList  {
        
        PS_1(0,"海外代理数量 同比/环比"),
        PS_2(1,"销售货量 同比、环比,可合并"),
        ;

        private EnumItem item=new EnumItem();
        ReportEnum(Integer key,String Value) {
            item.setKey(key);
            item.setVal(Value);
        }

        @Override
        public EnumItem<Integer> getEnumItem() {
            return item;
        }
    }

    //是否有效
    public enum IsValidEnum implements IEnumList  {
        Invalid(0, "无效"),
        Valid(1, "有效")
        ;

        private EnumItem item=new EnumItem();
        IsValidEnum(Integer key,String Value) {
            item.setKey(key);
            item.setVal(Value);
        }

        @Override
        public EnumItem<Integer> getEnumItem() {
            return item;
        }
    }

}

三  EnumHelper

重头戏,注释比较简单,大家应该明白的。

package com.leadtrans.report.common;

import com.leadtrans.report.model.Enum.EnumItem;
import com.leadtrans.report.model.Enum.EnumList;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * @author: Tyler
 * @createDate: 2021/12/8
 */


public class EnumUtil {
    /**
     * 获取枚举集合
     *
     * Enum
     *
     * @param <T>
     * @return List<EnumItem>
     */
    public static <T extends EnumList.IEnumList> List<EnumItem> getEnumList(
            Class<? extends EnumList.IEnumList> enumClass) {
        T[] q = (T[]) enumClass.getEnumConstants();
        List<EnumItem> v = Arrays.stream(q).map(T::getEnumItem).collect(Collectors.toList());
        return v;
    }

    /**
     * 根据字符串,动态获取枚举值
     * @param enumName
     * @param <T>
     * @return
     * @throws ClassNotFoundException
     */
    public static <T extends EnumList.IEnumList> List<EnumItem> getEnumList(
            String enumName) {
        try {
            Class enumClass=Class.forName(EnumList.class.getName()+"$"+enumName);
            return getEnumList(enumClass);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 根据枚举类型和key获取信息
     *
     * @param enumClass
     *            Enum
     * @param key
     *            Enum key
     * @param <T>
     * @return EnumItem
     */
    public static <T extends EnumList.IEnumList,U> EnumItem getEnumItem(Class<? extends EnumList.IEnumList> enumClass,
                                                                      U key) {
        T[] q = (T[]) enumClass.getEnumConstants();
        Optional<T> v = (Arrays.stream(q)).filter(x -> x.getEnumItem().getKey() == key).findFirst();
        if (v.equals(Optional.empty()))
            return null;
        T r = v.get();
        EnumItem s = r.getEnumItem();
        return s;
    }

    /**
     * 根据枚举类型和value获取信息
     *
     * @param enumClass
     *            Enum
     * @param value
     *            Enum value
     * @param <T>
     * @return EnumItem
     */
    public static <T extends EnumList.IEnumList> EnumItem getEnumItem(Class<? extends EnumList.IEnumList> enumClass,
                                                                      String value) {
        T[] q = (T[]) enumClass.getEnumConstants();
        Optional<T> v = (Arrays.stream(q)).filter(x -> x.getEnumItem().getVal() == value).findFirst();
        if (v.equals(Optional.empty()))
            return null;
        T r = v.get();
        EnumItem s = r.getEnumItem();
        return s;
    }


}

四  TestApplication

测试运行

@Test
    public void testEnumList(){
        //获取枚举的键值对(class)
        List<EnumItem> list= EnumUtil.getEnumList(EnumList.IsValidEnum.class);
        //获取枚举的键值对(class name)
        List<EnumItem> list1= EnumUtil.getEnumList("IsValidEnum");
        //获取枚举 name,key,val
        EnumList.IsValidEnum[] list2 = EnumList.IsValidEnum.values();

        //根据枚举类型和key获取信息
        EnumItem item=EnumUtil.getEnumItem(EnumList.IsValidEnum.class,0);
        //根据枚举类型和value获取信息
        EnumItem item1=EnumUtil.getEnumItem(EnumList.IsValidEnum.class,"无效");

    }

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐