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

2023-10-30

文章背景

本周有一个开发任务涉及到了枚举类型的修改,需要对枚举类型新增一项。在新增的时候我没有加在已有项的最后面,而是在中间随便找了个位置(其实也不是很随便,我是根据语义关联性觉得放在某一项后面比较合适)。没想到的是,我的无心之举经造成了大”混乱“,相关联的业务在使用该枚举类型时几乎都错位了。查了查,原来是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", 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从枚举类型的ordinal()方法说起 的相关文章

随机推荐

  • RocketMQ系列之集群搭建

    前言 上节我们对RocketMQ 以下简称RMQ 有了一些基本的认识 大致知道了 什么是RMQ以及他能做什么 今天我们来讲讲如何搭建RMQ 与其说搭建RMQ不如说是搭建RMQ集群 为什么这么说呢 看完这篇文章自然就懂了 RMQ几个重要角色
  • 蓝桥杯2022年第十三届决赛真题-小球称重

    目录 题目描述 输入格式 输出格式 样例输入 样例输出 提示 原题链接 代码思路 题目描述 小蓝有 N 个小球 编号 1 至 N 其中 N 1 是正品 重量相同 有 1 个是次品 重量比正品轻 为了找出次品 小蓝已经用天平进行了 M 次称重
  • 0-1背包问题使用回溯法

    对于0 1 背包问题可以用动态规划算法解决 这里先不说这种方法 只介绍回溯法 0 1背包问题的回溯法解决的解空间是子集树 下面给出最简洁的代码 比较方便理解呢 include
  • SSD固态硬盘的结构和基本工作原理概述

    我们都知道 早期的电脑CPU是可以直接从硬盘上面读取数据进行处理的 随着科技的进步 时代的发展 计算机硬件的发展速度也是极其迅猛 CPU主频的不断提升 从单核到双核 再到多核 CPU的处理速度越来越快 而硬盘的的读写速度已经远远跟不上CPU
  • Elasticsearch报错ValueError: Either ‘hosts‘ or ‘cloud_id‘ must be specified

    这个错误是由于在初始化 Elasticsearch 客户端时未指定有效的主机地址 hosts 或 Cloud ID cloud id 而引起的 Elasticsearch 客户端需要知道连接的 Elasticsearch 实例的位置才能正常
  • MMYOLO框架标注、训练、测试全流程(补充篇)

    前言 MMYOLO框架是一个基于PyTorch和MMDetection的YOLO系列算法开源工具箱 MMYOLO定位为YOLO系列热门开源库以及工业应用核心库 MMYOLO框架Github项目地址 支持的任务 目标检测 旋转目标检测 支持的
  • 【blender建模功能】03 倒角工具

    blender 03 倒角工具 基操 宽度类型 其他参数 倒角问题 顶点倒角 1 基础操作 2 宽度类型 3 其他参数 3 1 材质编号 3 2 平滑 3 2 1 自动光滑 3 2 2 硬化法线 3 3 钳制重叠 3 4 外衔接 内衔接 3
  • UE4联网2——视角同步

    在做完子弹的同步后发现和客户端和服务器的玩家的仰角是不同步的 所以在角色代码中加入tick函数更新玩家的仰角pitch 这里我们需要用到一个变量RemoteViewPitch 这是在pawn中定义的已经复制的公有变量 rpc 值得注意的是它
  • 忽略大小写的字符串比较

    问题描述 一般我们用strcmp可比较两个字符串的大小 比较方法为对两个字符串从前往后逐个字符相比较 按 ASCII 码值大小比较 直到出现不同的字符或遇到 0 为止 如果全部字符都相同 则认为相同 如果出现不相同的字符 则以第一个不相同的
  • vue3引用ElementPlus出错|如何在vue中引用TypeScript

    具体错误 直接套用elementplus官方文档里的模版 报错 Module parse failed Unexpected token You may need an additional loader to handle the res
  • 运放噪声如何计算?

    一 噪声 运放的噪声分为 1 电压噪声en v 2 电流噪声在电阻Rs和R1 R2上产生的等效噪声en i 3 电阻的热噪声enr 总输入噪声计算公式 en in sqrt env 2 eni 2 enr 2 总输出噪声计算公式 en ou
  • [第七届蓝帽杯全国大学生网络安全技能大赛 蓝帽杯 2023]——Web方向部分题 详细Writeup

    Web LovePHP 你真的熟悉PHP吗 源码如下
  • 【C++】C++入门

    目录 一 C 关键字 二 命名空间 2 1命名空间的定义 2 2命名空间的使用 2 2 1加命名空间名称和作用域限定符 2 2 2使用using 将命名空间中某个成员引入 2 2 3使用using namespace将命名空间引入 三 C
  • 【KnowledgeBase】CLIP多模态代码试玩

    文章目录 前言 一 CLIP整体流程简述 二 代码试玩 参考 前言 多模态CLIP的推理部分代码简单试玩一下 致敬大佬的CLIP 论文链接 Learning Transferable Visual Models From Natural L
  • JS中的“&&”与“&”和“

    在JavaScript中 和 是逻辑运算符 和 是位运算符 四个运算符主要区别是运算方法不一样 1 JavaScript中的位运算符 运算方法 两个数值的个位分别相与 同时为1才得1 只要一个为0就为0 举个例子 31 2 结果为2 理由
  • python-报错

    报错 异常名称 描述 BaseException 所有异常的基类 SystemExit 解释器请求退出 KeyboardInterrupt 用户中断执行 通常是输入 C Exception 常规错误的基类 StopIteration 迭代器
  • JS 统计字符

    var str id content value replace r n g n var length t str length
  • 使用Koa2进行Web开发(一)

    这篇文章是我正在进行写作的 新时期的Node js入门 的一部分 Connect Express与Koa 为了更好地理解后面的内容 首先需要梳理一下Node中Web框架的发展历程 Connect 在connect官方网站提供的定义是 Con
  • Python实现贝叶斯优化器(Bayes_opt)优化卷积神经网络回归模型(CNN回归算法)项目实战

    说明 这是一个机器学习实战项目 附带数据 代码 文档 视频讲解 如需数据 代码 文档 视频讲解可以直接到文章最后获取 1 项目背景 贝叶斯优化器 BayesianOptimization 是一种黑盒子优化器 用来寻找最优参数 贝叶斯优化器是
  • 从枚举类型的ordinal()方法说起

    文章背景 本周有一个开发任务涉及到了枚举类型的修改 需要对枚举类型新增一项 在新增的时候我没有加在已有项的最后面 而是在中间随便找了个位置 其实也不是很随便 我是根据语义关联性觉得放在某一项后面比较合适 没想到的是 我的无心之举经造成了大