No enum constant XXX.name,Enum$valueOf(),入参类型为枚举对象名

目录

使用场景

原因

valueOf源码

enumConstantDirectory源码


使用valueOf()出现异常

使用场景

public enum CertificateType {

    ID_CARD(1, "身份证"),
    PASSPORT(2, "护照"),
    OTHERS(3, "其他"),
    ORGANIZATION(4, "组织机构代码"),
    BUSINESS_LICENSE(5, "营业证号"),
    ;
}

//发生错误的代码
CertificateType type = CertificateType.valueOf("身份证");

原因

valueOf方法的入参类型为枚举对象名

valueOf源码

public abstract class Enum<E extends Enum<E>>
        implements Comparable<E>, Serializable {

    public static <T extends Enum<T>> T valueOf(Class<T> enumType,
                                                String name) {
        T result = enumType.enumConstantDirectory().get(name);
        if (result != null)
            return result;
        if (name == null)
            throw new NullPointerException("Name is null");
        throw new IllegalArgumentException(
            "No enum constant " + enumType.getCanonicalName() + "." + name);
    }
}

valueOf核心为enumConstantDirectory(),获取结果见下图

valueOf获取的结果为​​​​​​

enumConstantDirectory源码

public final class Class<T> implements java.io.Serializable,
                              GenericDeclaration,
                              Type,
                              AnnotatedElement {
   
    Map<String, T> enumConstantDirectory() {
        if (enumConstantDirectory == null) {
            T[] universe = getEnumConstantsShared();
            if (universe == null)
                throw new IllegalArgumentException(
                    getName() + " is not an enum type");
            Map<String, T> m = new HashMap<>(2 * universe.length);
            for (T constant : universe)
                m.put(((Enum<?>)constant).name(), constant);
            enumConstantDirectory = m;
        }
        return enumConstantDirectory;
    }
    private volatile transient Map<String, T> enumConstantDirectory = null;
}

拿到当前枚举类的各个对象组装结果如下: 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值