从枚举类型的ordinal()方法说起

文章背景

本周有一个开发任务涉及到了枚举类型的修改,需要对枚举类型新增一项。在新增的时候我没有加在已有项的最后面,而是在中间随便找了个位置(其实也不是很随便,我是根据语义关联性觉得放在某一项后面比较合适)。没想到的是,我的无心之举经造成了大”混乱“,相关联的业务在使用该枚举类型时几乎都错位了。查了查,原来是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"
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值