当前位置 : 首页 » 文章分类 :  开发  »  Java-枚举Enum

Java-枚举Enum

Java 枚举使用笔记

枚举比较

使用 == 和使用equals方法的执行结果是一样的。

因为在Enum类里面,已经重写了equals方法,而方法里面比较就是直接使用==,来比较2个对象的。所以,你在外边直接使用==也是可以的。

/**
 * Returns true if the specified object is equal to this
 * enum constant.
 *
 * @param other the object to be compared for equality with this object.
 * @return  true if the specified object is equal to this
 *          enum constant.
 */
public final boolean equals(Object other) {
    return this==other;
}

为什么枚举可以用==比较?

JLS 8.9 Enums 一个枚举类型除了定义的那些枚举常量外没有其他实例了。 试图明确地说明一种枚举类型是会导致编译期异常。在枚举中final clone方法确保枚举常量从不会被克隆,而且序列化机制会确保从不会因为反序列化而创造复制的实例。枚举类型的反射实例化也是被禁止的。总之,以上内容确保了除了定义的枚举常量之外,没有枚举类型实例。

因为每个枚举常量只有一个实例,所以如果在比较两个参考值,至少有一个涉及到枚举常量时,允许使用“==”代替equals()。

什么时候 == 和 equals 不一样?

== 不会抛出 NullPointerException

enum Color { BLACK, WHITE };

Color nothing = null;
if (nothing == Color.BLACK);      // runs fine
if (nothing.equals(Color.BLACK)); // throws NullPointerException

== 在编译期检测类型兼容性

enum Color { BLACK, WHITE };
enum Chiral { LEFT, RIGHT };

if (Color.BLACK.equals(Chiral.LEFT)); // compiles fine
if (Color.BLACK == Chiral.LEFT);      // DOESN'T COMPILE!!! Incompatible types!

比较java枚举成员使用equal还是==
https://github.com/giantray/stackoverflow-java-top-qa/blob/master/contents/comparing-java-enum-members-or-equals.md

enum枚举

Java 枚举(enum) 详解7种常见的用法
https://blog.csdn.net/qq_27093465/article/details/52180865

Java 中的枚举 (enum)
https://www.jianshu.com/p/46dbd930f6a2

深度分析Java的枚举类型—-枚举的线程安全性及序列化问题

枚举使用举例

package com.madaimeng;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.google.common.collect.Maps;
import java.util.Collections;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;

public enum AuthorizationType {

    UNKNOWN((byte) 0, "", "未知"),
    AUTHORIZED((byte) 1, "granted", "授权"),
    REVOKE((byte) 2, "revoked", "取消授权");

    private byte code; // 枚举的code,可用于和数据库字段映射
    private String mappingCode; // 对应的外系统code,用于接收外系统json数据时映射
    private String name; // 描述

    // 枚举的构造方法
    VehicleAuthorizationType(byte code, String mappingCode, String name) {
        this.code = code;
        this.mappingCode = mappingCode;
        this.name = name;
    }

    public byte getCode() {
        return code;
    }

    public String getMappingCode() {
        return mappingCode;
    }

    public String getName() {
        return name;
    }

    // 枚举内定义了两个map,分别用于根据外系统code查找对应的枚举值,和根据code查找对应的枚举值
    private static Map<Byte, VehicleAuthorizationType> codeMap = Maps.newHashMap();
    private static Map<String, VehicleAuthorizationType> mappingCodeMap = Maps.newHashMap();

    // 初始化两个map
    static {
        for (VehicleAuthorizationType value : VehicleAuthorizationType.values()) {
            codeMap.put(value.getCode(), value);
            mappingCodeMap.put(value.mappingCode, value);
        }
        codeMap = Collections.unmodifiableMap(codeMap);
        mappingCodeMap = Collections.unmodifiableMap(mappingCodeMap);
    }

    // 通过@JsonCreator标记为jackson反序列化构造方法,入参str是外系统code,即mappingCode
    @JsonCreator
    public static VehicleAuthorizationType getVehicleAuthorizationType(String str) {
        if (StringUtils.isBlank(str)) {
            return UNKNOWN;
        }
        return mappingCodeMap.get(str);
    }

    // 根据code查找对应的枚举类型
    public static VehicleAuthorizationType getByCode(byte code) {
        return codeMap.get(code);
    }

    // 根据外系统code查找对应的枚举类型
    public static VehicleAuthorizationType getByMappingCode(String mappingCode) {
        return mappingCodeMap.get(mappingCode);
    }
}

如果不需要映射数字或其他code,可以用下面这种精简的写法:

package com.madaimeng;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.google.common.collect.Maps;
import java.util.Collections;
import java.util.Map;
import java.util.Optional;
import org.apache.commons.lang3.StringUtils;

public enum Role {
    UNKNOWN("未知"),
    Role1("角色1"),
    Role2("角色2");

    private String desc;

    // 用于根据枚举的name查询
    private static Map<String, Role> nameMap = Maps.newHashMap();

    // map初始化
    static {
        for (Role value : Role.values()) {
            nameMap.put(value.name().toUpperCase(), value);
        }
        nameMap = Collections.unmodifiableMap(nameMap);
    }

    // 枚举的构造方法
    Role(String desc) {
        this.desc = desc;
    }

    // json反序列化构造方法
    @JsonCreator
    public static Role getRole(String str) {
        if (StringUtils.isBlank(str)) {
            return UNKNOWN;
        }
        return Optional.ofNullable(nameMap.get(str.toUpperCase())).orElse(UNKNOWN);
    }
}

研究下Enum抽象类

package java.lang;
public abstract class Enum<E extends Enum<E>>
        implements Comparable<E>, Serializable {

上一篇 Apache-HttpComponents

下一篇 Cassandra笔记

阅读
974
阅读预计5分钟
创建日期 2018-08-24
修改日期 2018-08-27
类别
标签
百度推荐