榨干枚举

作者: alonwang | 来源:发表于2020-06-18 08:37 被阅读0次

    前言

    数学计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。

    枚举是一个被命名的整型常数的集合,枚举在日常生活中很常见,例如表示星期的SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY就是一个枚举。

    维基百科

    枚举有穷序列集的特性与现实中很多事物的特点相符,在编程中也极其有用.Java语言提供了枚举机制,日常开发我们可能只用到了它的基础功能,而实际上,得益于Java中枚举的实现机制,它还有很多有用的特性.本文将简单介绍Java枚举的原理.以及如何有效的使用枚举.

    正文

    枚举的基础用法

    如果之前不了解枚举,那么最常用的形式可能是这样:手动给枚举加一个序号,并通过这个序号完成数字到枚举的转换,


    image.png

    这种方法当然可用,但是比较下代码量和便利性,好像不是很值得. 接口里定义变量当做枚举来做不是更香吗, 那枚举到底如何实现的呢?

    枚举是一种特殊的类

    枚举通过关键字enum定义,但实质上它还是类

    image.png

    编译器会对枚举做特殊处理,上面的Food枚举经过编译器处理后生成的字节码,我手动翻译为代码,大概是这样(这段代码是不能运行的,编译器写死了Enum不能被直接编写代码继承)

    image.png

    以上有几点需要注意

    • Enum是一个抽象类,编译器使Food继承了Enum,只能通过编译器处理去继承,不能在代码中手动继承

    • Food是 final的.原枚举中的枚举项被转换成Food类型的final类静态变量

    • Enum有两个字段,name和orinal. name就是字段名,ordinal是序号,从0开始,由字段定义顺序依次递增.

    • $VALUES是自动生成的枚举项的数组,下标和ordinal对应

    • static代码块,values()方法,valueOf方法都是编译器自动生成的

    既然如此,好玩的就来了

    我们可以让枚举容纳业务逻辑,而不是在业务层去判断类型处理.例如

    image.png

    我们可以把这些逻辑搬移到枚举中

    image.png

    然后直接这样使用,是不是简单明了

    image.png

    后记

    让我们一起,榨干枚举~

    相关文章

      网友评论

        本文标题:榨干枚举

        本文链接:https://www.haomeiwen.com/subject/kgeyxktx.html