网站首页 > 精选教程 正文
大家好,我是贠学文,点击右上方“关注”,每天为您分享java程序员需要掌握的知识点干货。
记得有人曾经和我说过,他在使用java的过程中,从来没有使用过enum。当然了,你不使用enum,一样可以编码,但是enum存在的意义,就是让我们的代码更加的便于开发和维护。
什么是enum
enum可以理解为将一组具有相同性质的常量封装成一个对象数组,封装成对象数组后,数组中的每个元素,都具有了对象的性质,使得我们在使用时,可以充分的利用面向对象的设计思想,对代码做解耦合,使代码的开发都维护,都变得更加简单。
举例来说,一个用户对象,有下面几种状态:正常、锁定、密码过期、注销。那我们用常量去定义时,代码如下图一所示:
用枚举以后,我们可以将这一组常量,封装成一个集合,代码如下图二所示:
这样封装以后,枚举中的每个元素,就都具有了对象的性质。那这样封装了以后,具体有什么好处呢?下面分别来说明。
enum能给我们带来哪些好处
方法入参的验证
假如有某方法,需要用户状态做入参,如果用常量的话,需要判断入参的参数值是否在常量的范围内,如下图三所示:
可以看出,这段代码中的对参数的验证,有些复杂,而且这还是变量值不多的情况,只有四个,如果常量值多了,将会更加复杂。那如果用枚举的方式呢,如下图四所示:
可以看出,用枚举做为入参的话,在方法中只判断枚举对象是否为空即可,非常简单,而且也不会枚举类中的值变多而使判断逻辑变得复杂。因为这里用了枚举类型做了强限制,只要传来的不是空,就参数一定是合法的,否则连编译都过不去。
反向查找
使用常量定义时,我们可以做正向查找,即可以根据状态找到对应的值,比如可以找到状态为正常的值为1,状态为锁定的值为2。但是有些时候,我们需要做反向查找,即通过状态的值,去找到该值对应的状态是什么,这个通过常量是无法做到的,但是通过枚举就可以做到。如下图五所示:
通过上图中的getByID方法,就可以通过值反向查找状态。
但是这样做的话,需要在每个枚举类中都重写这个方法,比较麻烦,所以我们可以就这个方法提取到工具类中复用。首先,我们先定义一个接口,如下图六所示:
然后再让我们定义的枚举类实现这个接口,如下图1.1.8-7所示:
下面再把反向查找的代码封装到工具类中,如下图八所示:
利用状态模式减少代码中的大量判断
假如有某方法,需要判断用户的状态,然后不同的状态,做出不同的行为,我们先看下使用常量会怎么做,如图九所示:
可见代码中会存在大量的判断,会后期的代码维护带来困难。可能有人会说,可以使用工厂模式,这样在使用的时候就没有这大量的判断了,但是这样的话,工厂类中还是会有大量的判断,效果是一样的,判断并没有减少,只是挪了一下地方而已,后期的维护还是很麻烦。
那如果用枚举类就会简单很多,首先我们在枚举类中定义一个抽象方法,然后让枚举中的每一个元素都重写这个方法,如下图十所示:
然后在使用时,只是简单调用这个方法即可,如下图十一所示:
这个就减少了大量的if判断,代码变得非常简单,易于维护。
但是在枚举中定义抽象方法,如果定义得多了,或者某个抽象方法的实现比较复杂,就会使这个枚举类变得很臃肿。这时我们抽象出来一个接口,然后把抽象方法都放到这个接口中,如下图十二所示:
然后在枚举类中,只需要返回每个元素对应的实现类的对象即可,如下图十三所示:
然后在使用时,如下图十四所示:
这样既让枚举类变得不再臃肿,又让在使用时变得简单,方便了后期的代码维护。
以上这些,就是我总结的enum能够给我们带来的好处,下一期,我们来讲一下enum的底层实现原理。
往期精彩:
作者介绍:
贠学文,具有多有经验的java开发工程师,业余时间利用头条分享技术知识点与自己对技术的感悟,帮助对自己未来感到迷茫的程序员,在技术上得到提升。结识一些志同道合的朋友,相互促进,共同进步。
猜你喜欢
- 2024-11-09 Java基础入门要学哪些 怎么掌握反射和枚举
- 2024-11-09 谈谈枚举的新用法--java java枚举类型有什么用
- 2024-11-09 Java面试基础回顾16-枚举 java面试基础知识点
- 2024-11-09 实际工作中推荐使用java枚举类型,提高开发效率#编程
- 2024-11-09 java枚举enumeration java枚举根据value获取key
- 2024-11-09 大年初二来简单聊聊java中枚举类的前世今生
- 2024-11-09 如何用枚举消除if/else?-枚举高阶用法
- 2024-11-09 干货 | 一文搞定Python 枚举 python 枚举遍历
- 2024-11-09 Scala学习九之枚举和Trait了解 枚举compareto
- 2024-11-09 Scala基础学习九之枚举和Trait了解
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)