java中的enum第一期:enum存在的意义

大家好,我是贠学文,点击右上方“关注”,每天为您分享java程序员需要掌握的知识点干货。

凌晨四点的北京

记得有人曾经和我说过,他在使用java的过程中,从来没有使用过enum。当然了,你不使用enum,一样可以编码,但是enum存在的意义,就是让我们的代码更加的便于开发和维护。

什么是enum

enum可以理解为将一组具有相同性质的常量封装成一个对象数组,封装成对象数组后,数组中的每个元素,都具有了对象的性质,使得我们在使用时,可以充分的利用面向对象的设计思想,对代码做解耦合,使代码的开发都维护,都变得更加简单。

举例来说,一个用户对象,有下面几种状态:正常、锁定、密码过期、注销。那我们用常量去定义时,代码如下图一所示:

图一

用枚举以后,我们可以将这一组常量,封装成一个集合,代码如下图二所示:

图二


这样封装以后,枚举中的每个元素,就都具有了对象的性质。那这样封装了以后,具体有什么好处呢?下面分别来说明。

enum能给我们带来哪些好处

方法入参的验证

假如有某方法,需要用户状态做入参,如果用常量的话,需要判断入参的参数值是否在常量的范围内,如下图三所示:

图三

可以看出,这段代码中的对参数的验证,有些复杂,而且这还是变量值不多的情况,只有四个,如果常量值多了,将会更加复杂。那如果用枚举的方式呢,如下图四所示:

图四

可以看出,用枚举做为入参的话,在方法中只判断枚举对象是否为空即可,非常简单,而且也不会枚举类中的值变多而使判断逻辑变得复杂。因为这里用了枚举类型做了强限制,只要传来的不是空,就参数一定是合法的,否则连编译都过不去。

反向查找

使用常量定义时,我们可以做正向查找,即可以根据状态找到对应的值,比如可以找到状态为正常的值为1,状态为锁定的值为2。但是有些时候,我们需要做反向查找,即通过状态的值,去找到该值对应的状态是什么,这个通过常量是无法做到的,但是通过枚举就可以做到。如下图五所示:

图五

通过上图中的getByID方法,就可以通过值反向查找状态。

但是这样做的话,需要在每个枚举类中都重写这个方法,比较麻烦,所以我们可以就这个方法提取到工具类中复用。首先,我们先定义一个接口,如下图六所示:

图六

然后再让我们定义的枚举类实现这个接口,如下图1.1.8-7所示:

图七

下面再把反向查找的代码封装到工具类中,如下图八所示:

图八


利用状态模式减少代码中的大量判断

假如有某方法,需要判断用户的状态,然后不同的状态,做出不同的行为,我们先看下使用常量会怎么做,如图九所示:

图九

可见代码中会存在大量的判断,会后期的代码维护带来困难。可能有人会说,可以使用工厂模式,这样在使用的时候就没有这大量的判断了,但是这样的话,工厂类中还是会有大量的判断,效果是一样的,判断并没有减少,只是挪了一下地方而已,后期的维护还是很麻烦。

那如果用枚举类就会简单很多,首先我们在枚举类中定义一个抽象方法,然后让枚举中的每一个元素都重写这个方法,如下图十所示:

图十

然后在使用时,只是简单调用这个方法即可,如下图十一所示:

图十一

这个就减少了大量的if判断,代码变得非常简单,易于维护。

但是在枚举中定义抽象方法,如果定义得多了,或者某个抽象方法的实现比较复杂,就会使这个枚举类变得很臃肿。这时我们抽象出来一个接口,然后把抽象方法都放到这个接口中,如下图十二所示:

图十二

然后在枚举类中,只需要返回每个元素对应的实现类的对象即可,如下图十三所示:

图十三

然后在使用时,如下图十四所示:

图十四

这样既让枚举类变得不再臃肿,又让在使用时变得简单,方便了后期的代码维护。

以上这些,就是我总结的enum能够给我们带来的好处,下一期,我们来讲一下enum的底层实现原理。

往期精彩:

工厂模式如何消除大量的if else 第二期

工厂模式如何消除大量的if else 第一期

java中if与switch的那些事

Elasticsearch的核心真的是倒排索引吗?

史上将String常量池讲得最透彻的文章

作者介绍:

贠学文,具有多有经验的java开发工程师,业余时间利用头条分享技术知识点与自己对技术的感悟,帮助对自己未来感到迷茫的程序员,在技术上得到提升。结识一些志同道合的朋友,相互促进,共同进步。

展开阅读全文

页面更新:2024-05-01

标签:常量   抽象   元素   接口   定义   对象   意义   状态   代码   简单   方法

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top