java枚举

188 阅读1分钟

如何使用?

定义枚举类

// 交易状态
public enum TradeStatus {

 // 交易状态: S:成功 , F:失败 , C:被冲正 , U:预记状态 , X:发送失败 , T: 发送超时 , E: 其他错误
 SUCCESS("S"), FAIL("F"); //各个不同的枚举值,SUCCESS相当于是调用枚举类的构造器创建了一个实例对象,入参S就是枚举类的数据的值

private final String value; //私有常量。注意:不能是static,因为枚举类需要创建好几个实例对象,每个实例对象的数据的值都不一样。

 private TradeStatus(String value) { //构造器私有,因为不能被外界调用
  this.value = value;
 }
 
 public String getValue(){
    return valuel;
 }
}

调用枚举类,访问枚举类的某个实例对象的数据

TradeStatus.SUCCESS.getValue();

工作使用

定义枚举类

package order.manager.service.controller.common;

/**
 * 风控维度
 * @author gzh
 * @createTime 2020/5/21 7:10 PM
 */
public enum RiskEnum {
    //
    CARD("card","银行卡号"),
    IP("ip","ip地址"),
    CORPORATE_CERTI("corporateCerti","法人证件号"),
    ID_NO("idno","法人证件号"),
    UNIFIED_SOCIAL_CREDITCODE("unifiedsocialcreditcode","统一社会信用代码"),
    PHONE("phone","手机号"),
    FINGER_PRINT("fingerprint","设备指纹"),
    COMPANY("company","公司全称"),
    NAME("name","姓名"),
    CUSTOMER_ID("customerid","用户号(登录号)");

    //
    private final String name;

    public String getName() {
        return name;
    }

//    public void setName(String name) {
//        this.name = name;
//    }

    public String getValue() {
        return value;
    }

//    public void setValue(String value) {
//        this.value = value;
//    }

    private final String value;

    //
    RiskEnum(String name, String value) {
        this.name=name;
        this.value=value;
    }
}

调用枚举类

/**
 * 转换为中文名字
 *
 * @param redInfoStr
 * @return
 */
public static List convertName2(String redInfoStr){
    log.info("redInfoStr:{}",redInfoStr);
    List<RedInfo> redInfoList = new ArrayList<>();

    try {
        //
        com.alibaba.fastjson.JSONArray redInfoArray = new com.alibaba.fastjson.JSONArray();
        if (StringUtils.isNotEmpty(redInfoStr)) {
            redInfoArray = (com.alibaba.fastjson.JSONArray) com.alibaba.fastjson.JSONObject.parse(redInfoStr);
        }
        if (redInfoArray != null) {
            for (int i = 0; i < redInfoArray.size(); i++) {
                com.alibaba.fastjson.JSONObject jsonObject = (com.alibaba.fastjson.JSONObject) redInfoArray.get(i);
                RedInfo redInfo = new RedInfo();
                redInfo.setName(jsonObject.getString("tag"));
                redInfo.setValue(jsonObject.getString("uniqueId"));
                redInfoList.add(redInfo);
            }
        }

        //
        for (int i = 0; i < redInfoList.size(); i++) {
            RedInfo redInfo = (RedInfo) redInfoList.get(i);
            String name = (String) redInfo.getName();
            if (RiskEnum.CARD.getName().equals(name)) { //访问枚举类的实例对象的数据
                redInfo.setName(RiskEnum.CARD.getValue());
            } else if (RiskEnum.IP.getName().equals(name)) {
                redInfo.setName(RiskEnum.IP.getValue());
            } else if (RiskEnum.CORPORATE_CERTI.getName().equals(name)) {
                redInfo.setName(RiskEnum.CORPORATE_CERTI.getValue());
            } else if (RiskEnum.ID_NO.getName().equals(name)) {
                redInfo.setName(RiskEnum.ID_NO.getValue());
            } else if (RiskEnum.UNIFIED_SOCIAL_CREDITCODE.getName().equals(name)) {
                redInfo.setName(RiskEnum.UNIFIED_SOCIAL_CREDITCODE.getValue());
            } else if (RiskEnum.PHONE.getName().equals(name)) {
                redInfo.setName(RiskEnum.PHONE.getValue());
            } else if (RiskEnum.FINGER_PRINT.getName().equals(name)) {
                redInfo.setName(RiskEnum.FINGER_PRINT.getValue());
            } else if (RiskEnum.COMPANY.getName().equals(name)) {
                redInfo.setName(RiskEnum.COMPANY.getValue());
            } else if (RiskEnum.NAME.getName().equals(name)) {
                redInfo.setName(RiskEnum.NAME.getValue());
            } else if (RiskEnum.CUSTOMER_ID.getName().equals(name)) {
                redInfo.setName(RiskEnum.CUSTOMER_ID.getValue());
            }
        }
    } catch (Exception e) {
        log.error("转换为中文名字异常",e);
    }

    log.info("redInfoList:{}", com.alibaba.fastjson.JSONObject.toJSONString(redInfoList));
    return redInfoList;
}

主要是访问枚举类的实例对象的数据,比如:

RiskEnum.CARD.getName().equals(name) //访问某个实例对象的name字段

默认继承Enum类,就像所有的类默认继承Object类

申明自定义枚举类的时候,有关键字enum,jdk就知道默认继承Enum类。

应用场景

如果值之间有关系,属于同一业务相关的值,就用枚举

不要用普通类的静态常量,而应该使用枚举,因为一个普通类往往定义了所有的常量,包含了各种业务,很混乱,不好维护。用枚举的话,一目了然,枚举类的作用和每个值一目了然。

而且数据的数据类型也定义好了,不会错。

public enum TradeType {

 POSITION_TRADE(0), // 正交易
 NEGATIVE_TRADE(1), // 反交易
 UNKNOW_TRADE(-1); // 未知交易

private final int value;

 private TradeType(String value) {
  this.value = value;
 }
}

另外,顺便说一下,数据的数据类型,如果可以用基础数据类型,就不要用字符串。比如,如果确定是int就用int,确定是boolean就用boolean,就没有必要全部都用字符串。

如果值之间没有关系,就用普通类

spring boot源码

如果静态常量数据,只有当前类自己使用,那么就直接定义在当前类里面就可以了,没有必要定义在其他单独的类。而且直接用静态常量就可以了,也没有必要用枚举。比如:jdk-BigDecimal

开源框架spring和spring boot

spring,按哪种方式注入bean。

spring boot,用哪种缓存类型。

参考

www.liaoxuefeng.com/wiki/125259…

www.runoob.com/java/java-e…