zoukankan      html  css  js  c++  java
  • 对Java枚举的一点思索

    前言:

    公司的一个新项目,第一版并不是我写的,需要新加入功能,接手后,发现红包活动的状态还是比较多的。由于第一版比较急吧,没有统一,自己不是特别忙,索性把它们从注释中整理下,新建一个枚举包和几个枚举类。

    好奇心

    整理之后,突发好奇心,就搜下了枚举有哪些骚操作,啊哈哈,其实我内心真实的想法是:1.该怎么才能用好枚举呢?2.枚举真正的意义是什么,如果我了解了它真正的意义,就能在合适的地方使用它。
    搜了一下,搜到两篇不错的:
    ref:
    恕我直言,我怀疑你没怎么用过枚举
    Java枚举:小小enum,优雅而干净

    大佬们的文章,都很不错,通过都大佬的文章以及自己的思考也得出一些感悟,记录下。

    提示下:我理解问题都是不断深究,然后回退,形成自己的理解栈。这篇文章是对当前水平的我的理解栈的描述,仅供参考。

    对枚举的思考

    工具嘛,都有场景的适用性,这很重要,因为我们不应该在场景使用不合适的工具。
    有一类场景,它们的数据不怎么易变,我们一方面要用 key标识它们,一方面还要用value描述他们(value 可以有很多),怎么做呢?
    1.直接硬编码,将key和value 都直接通过if else 写入程序
    这种方式,非常不利于维护,一旦value需要改变,那么程序中的每一处value都需要被更改,key亦是如此。那就进阶一波

    2.将 key,value定义为 field
    这种方式,比起上面已经容易维护了很多。当key value变动时,我们只需要更改 field对应的值即可。但是,还有一个问题,我们发现同一场景下的这种数据往往具有极大的相似性。
    例如,表示季节,某种状态等时。用来表示它们的key value的类型都是一样的,我们能否进一步抽取成为类呢?如果不抽取,其表现形式为 pre + key / pre + value,例如 summerKey summerValue 。
    如果将key,value抽取为类,我们就可以通过常量指向 具有key vlue属性的对象。表现形式为 Summer.key SUMMER.value,这是类就有点静态工厂的形式了。
    为什么要用常量呢?主要是考虑到该场景下一般都没有资源的调用,都只是 状态及信息数据的表示。 这也提示我们,如果涉及资源的调用,是否将其以常量的形式常驻内存就值得考虑了。

    3.其实,Java枚举编译后就是静态工厂,继承自Enum类的静态工厂(可通过反编译查看),未编译时由编译器提供的语法糖进行语法支持。Enum语法糖的存在,使得我们可以编写简洁易懂的代码,而编译器根据语法糖规则做了很多额外的工作。
    我们希望代码完成一件事能够非常简洁和易懂,而语法糖一直都在做这一件事,不断通过语法糖的形式弥补原生语言特性的不足。从而让我们更高效的开发。

    4.通过编译器对枚举特性的支持,我们可以避免越界问题

    5.枚举是 是编译器层面提供的语法糖,编译后的最终形式是 继承Enum类生成静态工厂。

    6.枚举提供的 valueOf()方法,如果用的上,可以帮我们减少if else

    仅仅记录一下,我想写完整,但又很难描述出来,写的不太好,以后有时间还会改吧。

  • 相关阅读:
    关于python3在centOS7下源码安装的配置
    nginx服务器多虚拟主机配置
    完全数
    高精度计算组合数
    算法竞赛入门经典第六章总结
    线段树
    奶牛
    算法竞赛入门经典第五章总结
    优先队列的使用方法
    放魔法石的游戏
  • 原文地址:https://www.cnblogs.com/yzw-daemon/p/14246533.html
Copyright © 2011-2022 走看看