文章背景
本周有一个开发任务涉及到了枚举类型的修改,需要对枚举类型新增一项。在新增的时候我没有加在已有项的最后面,而是在中间随便找了个位置(其实也不是很随便,我是根据语义关联性觉得放在某一项后面比较合适)。没想到的是,我的无心之举经造成了大”混乱“,相关联的业务在使用该枚举类型时几乎都错位了。查了查,原来是ordinal()在作怪。写Java代码时间也不算短了,但用到枚举类型的次数不多,ordinal()方法就更少用了。趁着这次机会对枚举类型及ordinal()方法稍稍做了下研究,于是就有了这篇文章。
Java枚举类型
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。 —— [ Java的枚举类型 ]
例子
参考了java枚举类型enum的使用这篇文章
public enum Light {
/**
* 红灯
*/
RED ,
/**
* 绿灯
*/
GREEN ,
/**
* 黄灯
*/
YELLOW ;
}
public static void main(String[] args) {
System.out.println(Light.GREEN.ordinal());
}
输出结果是:1
小结
我想,ordinal()方法在设计之初,仅仅只是像每一个javabean的get方法一样,返回枚举项在枚举类中出现的序号而已(从0开始的,所以这里的绿灯序号是1)。但是,聪明的我们,却发掘出了它的其他作用。聪明反被聪明误,说的就是我们吧。下面就将项目中的使用方式列出来,作为一个不成功的反例展示给大家。
反例解析
现场还原
服务端对图片枚举类型的定义:
public enum ImageEnum {
other("其它"),
logo("_游戏logo"),
split("_游戏截图"),
banner("游戏大图"),
advert("广告"),
information("资讯"),
column("栏目"),
imgs("图集"),
videopreview("视频预览");
private final String value;
/**
* @param value
*/
private ImageEnum(String value) {
this.value = value;
}
/**
* 定义获取游戏图片alt值
* @param enumValue
* @return
*/
public static String getImageEnumValue(ImageEnum enumValue) {
String val;
switch (enumValue) {
case other:
val = ImageEnum.other.value;
break;
case logo:
val = ImageEnum.logo.value;
break;
……
……
case imgs:
val = ImageEnum.imgs.value;
break;
default:
val = "";
}
return val;
}
}
action中声明一个枚举类:
//设置图标类型
ImageEnum banner = ImageEnum.banner;
前端页面拿到这个枚举类:
gameImgBannerType = ${banner.ordinal()}
js中使用了枚举类的序号并作为参数传给服务端处理:
jQuery('#file_upload').uploadify({
'swf' : '/public/include/uploadify/uploadify.swf',
'uploader' : '/Games/uploadImg?Id='+gameImgBannerType+'&gameId='+tmpGameId,
'fileObjName' : 'file',
'method' : 'POST',
'fileTypeExts' : '*.*',
'formData' : {},
……
});
回到action层,看看action层拿到这个枚举类的序号干嘛用:
public static void uploadImg(@Required @Valid File file, Boolean img2jpgs) throws IOException {
response.setContentTypeIfNotSet("text/html");
String imgType = RequestHelper.getParam("Id"