正如他们所说,剥猫皮的方法不止一种。首先,枚举值应该是大写的(用下划线分隔的单词),因为它们是常量值,应该由Java命名约定来对待。至少,它们应该以大写字母开头,就像所有类名一样。
public enum AreaCode {
    AREA_1(7927),
    AREA_2(7928),
    AREA_3(7929);
    private int areaCode;
    private AreaCode(int areaCode) {
        this.areaCode = areaCode;
    }
    public int getAreaCode() {
        return areaCode;
    }
}
现在,有三种方法可以通过实例变量检索枚举。switch 语句、具有相等条件的循环和查找映射。最后一种情况可能会为您的程序添加更多内存,但是如果您需要快速查找大量枚举,这将帮助您以恒定的速率O(1)时间完成。
下面的每个枚举类都具有相同的行为,但每个枚举类在内部执行不同的操作。通过将以下方法添加到这些类中的任何一个,您将获得相同的结果。main()
public static void main(String[] args) {
    System.out.println(retrieveByAreaCode(7928));
}
上面的示例将打印:
AreaCode[name="AREA_2", value="7928"]
开关
查找是O(1)(恒定时间),但你需要对每个情况进行硬编码(不是很动态)。
public enum AreaCode {
    AREA_1(7927),
    AREA_2(7928),
    AREA_3(7929);
    private int areaCode;
    private AreaCode(int areaCode) {
        this.areaCode = areaCode;
    }
    public int getAreaCode() {
        return areaCode;
    }
    public static AreaCode retrieveByAreaCode(int n) {
        switch (n) {
            case 7927:
                return AreaCode.AREA_1;
            case 7928:
                return AreaCode.AREA_2;
            case 7929:
                return AreaCode.AREA_3;
            default:
                return null;
        }
    }
    @Override
    public String toString() {
        return String.format("%s[name=\"%s\", value=\"%d\"]",
                this.getClass().getName(), this.name(), this.getAreaCode());
    }
}
圈
查找是 O(n)(线性时间),因此您需要遍历每个值,直到找到匹配项,但您确实需要对每个情况进行硬编码(动态)。
public enum AreaCode {
    AREA_1(7927),
    AREA_2(7928),
    AREA_3(7929);
    private int areaCode;
    private AreaCode(int areaCode) {
        this.areaCode = areaCode;
    }
    public int getAreaCode() {
        return areaCode;
    }
    public static AreaCode retrieveByAreaCode(int n) {
        for (AreaCode areaCode : AreaCode.values()) {
            if (areaCode.getAreaCode() == n) {
                return areaCode;
            }
        }
        return null;
    }
    @Override
    public String toString() {
        return String.format("%s[name=\"%s\", value=\"%d\"]",
                this.getClass().getName(), this.name(), this.getAreaCode());
    }
}
查找
查找是 O(1)(常量时间),您不需要对每个值进行硬编码(动态),但需要存储占用内存的映射。
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public enum AreaCode {
    AREA_1(7927),
    AREA_2(7928),
    AREA_3(7929);
    private static final Map<Integer, AreaCode> LOOKUP_MAP;
    private int areaCode;
    static {
        LOOKUP_MAP = new HashMap<Integer, AreaCode>();
        for (AreaCode areaCode : AreaCode.values()) {
            LOOKUP_MAP.put(areaCode.getAreaCode(), areaCode);
        }
        LOOKUP_MAP = Collections.unmodifiableMap(LOOKUP_MAP);
    }
    private AreaCode(int areaCode) {
        this.areaCode = areaCode;
    }
    public int getAreaCode() {
        return areaCode;
    }
    public static AreaCode retrieveByAreaCode(int n) {
        return LOOKUP_MAP.get(n);
    }
    @Override
    public String toString() {
        return String.format("%s[name=\"%s\", value=\"%d\"]",
                this.getClass().getName(), this.name(), this.getAreaCode());
    }
}
通用方法
EnumUtils.java
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class EnumUtils {
    public static interface EnumProperty<T extends Enum<T>, U> {
        U getValue(T type);
    }
    public static <T extends Enum<T>, U> Map<U, T> createLookup(Class<T> enumTypeClass, EnumProperty<T, U> prop) {
        Map<U, T> lookup = new HashMap<U, T>();
        for (T type : enumTypeClass.getEnumConstants()) {
            lookup.put(prop.getValue(type), type);
        }
        return Collections.unmodifiableMap(lookup);
    }
}
import java.util.Map;
public enum AreaCode {
    AREA_1(7927),
    AREA_2(7928),
    AREA_3(7929);
    private static final EnumUtils.EnumProperty<AreaCode, Integer> ENUM_PROP;
    private static final Map<Integer, AreaCode> LOOKUP_MAP;
    static {
        ENUM_PROP = new EnumUtils.EnumProperty<AreaCode, Integer>() {
            @Override
            public Integer getValue(AreaCode code) {
                return code.getAreaCode();
            }
        };
        LOOKUP_MAP = EnumUtils.createLookup(AreaCode.class, ENUM_PROP);
    }
    private int areaCode;
    private AreaCode(int areaCode) {
        this.areaCode = areaCode;
    }
    public int getAreaCode() {
        return areaCode;
    }
    public static AreaCode retrieveByAreaCode(int n) {
        return LOOKUP_MAP.get(n);
    }
    @Override
    public String toString() {
        return String.format("%s[name=\"%s\", value=\"%d\"]",
                this.getClass().getName(), this.name(), this.getAreaCode());
    }
}