Java中enum跟int不一樣,相當於兩個不同的類型,不能相互轉化,如果需要轉換需要增加額外的方法。如果自己定義初值,並且希望可以根據數值在switch里面進行方便的比較,需要做一些特別的處理。
Enum的原型如下:
public abstract class Enum<E extends Enum<E>> implements Serializable, Comparable<E> {
private final String name;
private final int ordinal;
}
其中,name就是你定義的枚舉的名字,如EStudent、ETeacher等。ordinal按照你定義的先后順序順次排列,值為0、1、2...。
需要注意的是,android里面Enum類型是不能被繼承的,而且重寫起來也非常困難,比如需要BasicLruCache.java、EmptyArray.java、Class.java等諸多文件,而Class.java又引用了很多的包,比如:
import sun.misc.Unsafe;
import sun.reflect.ConstantPool;
import sun.reflect.Reflection;
import sun.reflect.ReflectionFactory;
import sun.reflect.SignatureIterator;
import sun.reflect.generics.factory.CoreReflectionFactory;
import sun.reflect.generics.factory.GenericsFactory;
import sun.reflect.generics.repository.ClassRepository;
import sun.reflect.generics.repository.MethodRepository;
import sun.reflect.generics.repository.ConstructorRepository;
import sun.reflect.generics.scope.ClassScope;
import sun.security.util.SecurityConstants;
import sun.reflect.annotation.*;
......
因此,要重寫一個MyEnum替代enum是比較困難的:
public abstract class MyEnum<E extends MyEnum<E>> implements Serializable, Comparable<E> {
}
但是要達到上述目的卻是可以的,看下面的例子。
這是用戶的期望:
int val = 2;
MyEnum type = EnumUtils.getMyEnum(MyEnum.class, val);
val = 10;
MyEnum defaultType = MyEnum.EUnknown;
type = EnumUtils.getMyEnum(MyEnum.class, val, defaultType);
switch(type) {
case EUnknown:
break;
case EStudent:
break;
case STeacher:
break;
}
在實際項目中,MyEnum 的枚舉值可能是這樣的:
public enum MyEnum {
EUnknown(0),
EStudent(2),
STeacher(3);
}
甚至是這樣的:
ENewsText(0x1001),
ENewsWithSlide(0x1002),
ENewsWithVideo(0x1003),
ENewsComment(0x1004),
EMatch(0x2000), //比賽,小於0x2000的是新聞
EMatchLiveVideoPresent(0x2001),
EMatchLiveTextPresent(0x2002),
EMatchOver(0x2003),
EMatchLiveVideoDNS(0x2004),
EMatchLiveTextDNS(0x2005),
因此,首先需要實現賦初值(private):
int val;
MyEnum(int val) {
this.val = val;
}
其次,要實現int與enum的轉換。
enum轉換為int,非常簡單,只需要注意到val與ordinal的不同:
public int getVal() {
return val;
}
最后,要實現int轉換為enum,強大的Java當然不會傻瓜到需要你通過switch(val)的方式返回不同的enum值,可以通過如下的方式:
public static <T extends Enum<T>> T getMyEnum(Class<T> enumType, int val) {
return getMyEnum(enumType, val, null);
}
public static <T extends Enum<T>> T getMyEnum(Class<T> enumType, int val, T defaultT) {
T ret = defaultT;
try {
T[] myEnums = enumType.getEnumConstants();
Field fl = enumType.getDeclaredField("val");
if(myEnums != null && myEnums.length > 0) {
for(T t : myEnums) {
try {
if(val == fl.getInt(t)) {
ret = t;
break;
}
} catch (IllegalArgumentException e) {
// e.printStackTrace();
} catch (IllegalAccessException e) {
// e.printStackTrace();
}
}
}
} catch (NoSuchFieldException e) {
// e.printStackTrace();
} catch(NullPointerException e) {
// e.printStackTrace();
}
return ret;
}
菜鳥們,勇敢地拿去吧! ^_^
