您的位置:首页 > 其它

如何将整型数转换为枚举类型以方便在switch中的使用

2013-05-30 20:34 513 查看
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.javaEmptyArray.javaClass.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;
}


菜鸟们,勇敢地拿去吧! ^_^
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐