正如他们所说,剥猫皮的方法不止一种。首先,枚举值应该是大写的(用下划线分隔的单词),因为它们是常量值,应该由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());
}
}