专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

探究枚举与接口常量类常量的区别

  头条创作挑战赛一个简单的需求
  在我们实际开发java项目过程中,突然有一天领导老王给了个任务,公司系统需要支持商品管理的需求比如水果有:苹果,香蕉,葡萄等等,电子产品有:电脑,手机,摄像机等等
  我们一般新建商品类Goods:publicclassGoods{商品名称privateStringname;商品类型privateIntegertype;publicGoods(Stringname,Integertype){this。namename;this。typetype;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this。namename;}publicIntegergetType(){returntype;}publicvoidsetType(Integertype){this。typetype;}}
  然后我们就直接可以使用它:publicclassGoodsTest{publicstaticvoidmain(String〔〕args)throwsInterruptedException{GoodsgoodsnewGoods(水果,1);1代表苹果,2:香蕉,3:葡萄System。out。println(goods。getName());}}
  但是有个问题,业务代码不清晰,有时候开发人员并不知道1、2、3代表什么意思,而且在业务代码层里面直接写数字或者字符串也是非常危险的时,我们需要一种方案,既能将相关的状态,类型放在一起,又可以限制类的输入值,提升项目的安全性接口常量
  我们可以使用接口常量来解决上面的问题publicinterfaceStatusContentFace{publicstaticfinalStringfruitfruit;publicstaticfinalIntegerapple1;publicstaticfinalIntegerbanana2;publicstaticfinalIntegergrape3;publicstaticfinalStringeleProducteleProduct;publicstaticfinalIntegercomputer101;publicstaticfinalIntegerphone102;publicstaticfinalIntegercamera103;}
  我们再来看下测试类:publicclassGoodsTest1{publicstaticvoidmain(String〔〕args)throwsInterruptedException{GoodsgoodsnewGoods(StatusContentFace。fruit,StatusContentFace。apple);Goodsgoods2newGoods(StatusContentFace。eleProduct,StatusContentFace。computer);System。out。println(goods。getName());System。out。println(goods2。getName());}}
  这样能够让相关的常量都在同一个接口文件中,接口常量,写起来比较简洁,但是为了让其他人知道每个常量的含义,最好写上注释。但它同时有个问题,由于java中接口是支持多继承的我们可以将内容深入到其实现类代码中,这样对于一个常量类接口来说显然是不合理。我们还可以在其子接口里继续添加常量,这样在祖先接口中就无法控制所有常量,这样无疑是非常危险的。
  一般不建议用的,但接口常量也不是一无是处的,可以通过内部接口来实现分组效果publicclassGoodsTest2{publicstaticvoidmain(String〔〕args)throwsInterruptedException{GoodsgoodsnewGoods(Fruit。type,Fruit。banana);Goodsgoods2newGoods(EleProduct。type,EleProduct。phone);System。out。println(goods。getName());System。out。println(goods2。getName());}常量分组publicinterfaceFruit{Stringtypefruit;Integerapple1;Integerbanana2;Integergrape3;}publicinterfaceEleProduct{StringtypeeleProduct;Integercomputer101;Integerphone102;Integercamera103;}}
  这样我们可以把相关的常量都归为一类,更加简洁明了类常量
  我们一般常用的是类常量方式:publicfinalclassStatusConstant{privateStatusConstant(){}防止该类实例化publicstaticfinalStringfruitfruit;publicstaticfinalIntegerapple1;publicstaticfinalIntegerbanana2;publicstaticfinalIntegergrape3;publicstaticfinalStringeleProducteleProduct;publicstaticfinalIntegercomputer101;publicstaticfinalIntegerphone102;publicstaticfinalIntegercamera103;}
  注意:一般用final关键字修饰class防止其被继承,并将其构造函数private化,防止被实例化
  测试类:publicclassGoodsTest3{publicstaticvoidmain(String〔〕args)throwsInterruptedException{GoodsgoodsnewGoods(StatusConstant。fruit,StatusConstant。banana);Goodsgoods2newGoods(StatusConstant。eleProduct,StatusConstant。phone);System。out。println(goods。getName());System。out。println(goods2。getName());}}
  我们可以发现类常量的方式,的确很方便,也没有接口常量多继承的烦恼。但是她所能承接的信息,维度不够,只能一个字段的去承接信息,然而当项目复杂的话,我们希望往往其能承接更多维度的信息,类似于对象一样,拥有更多的属性{name:。。。,type:。。。,。。。}
  这时候,我们本文的主角,枚举就闪亮登场了!
  枚举什么是枚举?
  枚举是一种特殊的类,所有的枚举类都是Enum类的子类,就类似Object类一样,由于java类是单继承的,所以不能在继承其他类或者枚举了。枚举变量不能使用其他的数据,只能使用枚举中常量赋值。能提高程序的安全性。
  格式:publicenum枚举名{枚举的取值范围}枚举常量
  我们先定义一个枚举类,来定义常量:publicenumContentEnums{Apple(1,苹果),Banana(2,香蕉),Grape(3,葡萄),Computer(101,电脑),Phone(102,手机),Camera(103,摄像机),Fruit(10010,fruit),EleProduct(10020,eleProduct);privateIntegercode;privateStringdesc;ContentEnums(Integercode,Stringdesc){this。codecode;this。descdesc;}publicIntegergetCode(){returncode;}publicvoidsetCode(Integercode){this。codecode;}publicStringgetDesc(){returndesc;}publicvoidsetDesc(Stringdesc){this。descdesc;}}
  测试类:publicclassGoodsTest4{publicstaticvoidmain(String〔〕args)throwsInterruptedException{GoodsgoodsnewGoods(ContentEnums。Fruit。getDesc(),ContentEnums。Apple。getCode());Goodsgoods2newGoods(ContentEnums。EleProduct。getDesc(),ContentEnums。Phone。getCode());System。out。println(goods。getName());System。out。println(goods2。getName());}}
  看到这大家可能就有疑问了,枚举和常量类相比,有什么优点吗?枚举其实是一种特殊的类,可以承接对象的多维信息,但是常量类往往只能承接字段,信息比较单一枚举可以搭配switch语句使用,来代替ifelseContentEnumscontentContentEnums。Apple;switch(content){caseApple:System。out。println(苹果);break;caseBanana:System。out。println(香蕉);break;caseGrape:System。out。println(葡萄);break;default:System。out。println(未找到匹配类型);}enum有一个非常有趣的特性,它可以为enum实例编写方法publicenumMethodEnums{VERSION{OverrideStringgetInfo(){returnSystem。getProperty(java。version);}},DATETIME{OverrideStringgetInfo(){returnDateFormat。getDateInstance()。format(newDate());}};abstractStringgetInfo();publicstaticvoidmain(String〔〕args){for(MethodEnumscsm:values()){System。out。println(csm。getInfo());}}}
  结果:1。8。0271
  2022921
  除了抽象方法,普通方法也是可以的,这里就不展示了网上还有其他一些优点,感觉没啥特别值得说的限制输入的类型
  我们可以通过枚举来将相关的状态,类型放在一起,文章一开头,但我们怎么才能限制类的输入值呢?其实很简单,别被绕进去,我们只需将输入类型改为指定的枚举即可我们改造一下Goods类:publicclassGoods{商品名称privateStringname;商品类型privateIntegertype;publicGoods(Stringname,Integertype){this。namename;this。typetype;}publicGoods(){防止外部实例化}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this。namename;}publicIntegergetType(){returntype;}publicvoidsetType(Integertype){this。typetype;}publicstaticGoodsaddGoods(ContentEnumsenums){GoodsgoodsnewGoods();goods。setName(enums。getDesc());goods。setType(enums。getCode());returngoods;}}
  测试类:publicclassGoodsTest5{publicstaticvoidmain(String〔〕args)throwsInterruptedException{GoodsgoodsGoods。addGoods(ContentEnums。Apple);Goodsgoods2Goods。addGoods(ContentEnums。Computer);System。out。println(goods。getName());System。out。println(goods2。getName());}}
  这样,我们就可以限制创建对象时的输入值类型了枚举可以使用来比较吗?
  可以使用来比较enum实例,编译器会自动为你提供equals()和hashCode()方法。Enum类实现了Comparable接口,所以它具有compareTo()方法。同时,它还实现了Serializable接口。枚举实现单例
  枚举类型是天生线程安全的,并且只会装载一次,我们可以利用了枚举的这个特性来实现单例publicenumSingleInstance{INSTANCE;publicvoidfunDo(){System。out。println(doSomething);}}
  使用方式:SingleInstance。INSTANCE。funDo()这种方法充分利用枚举的特性,让JVM来帮我们保证线程安全和单一实例的问题。写法也极其简洁。
  参考资料:
  《OnJava8》
  《Effectivejava》第3版
  本篇文章到这里就结束啦,如果我的文章对你有所帮助,还请帮忙一键三连:点赞、关注、收藏,你的支持会激励我输出更高质量的文章,感谢!
  计算机内功、源码解析、科技故事、项目实战、面试八股等更多硬核文章,首发于公众号小牛呼噜噜,我们下期再见!

足坛疯狂一夜!3冠王倒下,C罗创纪录反超梅西,曼联创23年纪录笑泪参半的比赛跌宕起伏,足坛犹如大海,C罗也沉浮其中,比赛波澜壮阔,有人哑火,有人进球如麻,7日凌晨,足坛掀起新一轮波涛,意甲3冠王罗马12被贝蒂斯逆转,穆里尼奥超神换人没能带来奇惠兰马丁内利是目前英超最出色边锋阿森纳是冠军有力争夺者直播吧10月7日讯本赛季到目前为止马丁内利为阿森纳联赛出场8次,打进3球,助攻1次,对于他的表现,前利兹联前锋惠兰在接受采访的时候给予了肯定。惠兰说马丁内利现在有理由成为英超最出色节后还会涨吗?美元存款利率飙升,加息预期扰动储户钱袋子美联储激进加息预期下,美国国债收益率飙升,国内美元存款利率也水涨船高。9月中美利差走阔背景下,继多次调整后,不少银行又在国庆假期前再次上调美元存款利率,有银行1年期定存最高利率达到乘着党建的翅膀推进学科建设以中文学科建设为例专访湖南科技学院文法学院教工第一党支部书记何建良近年来,高校加强了党建工作,高校教师党支部是把党的路线方针政策落实到高校基层的战斗堡垒,是党团结和联系广大教师的桥梁纽带,是办好中国一只蚊子和一只蚊子作战了3个晚上,每次都以失败告终,这只蚊子的智商远在我之上,关灯就哼唱着出现,开灯就无踪影,我身上每增加一个奇痒的红豆就是它宣告的每一次胜利。对它这种明目张胆的挑衅我很沮快乐有三法舍得忘记放下人越长大,越会觉得,发自内心的快乐很难。从前一点小事,就能高兴半天,如今,心似乎已渐渐被焦虑麻木填满。生活不易,总有太多的纷扰,在时刻左右着我们的心境。但人生苦短,尽管有很多不开心真正的高手,都有超强的布局思维经常会在生活当中听到人们说走一步看一步吧,也会听到一些人说车到山前必有路,船到桥头自然直。每个人的人生,注定都是自己头脑中思维的产物,你对这个世界认知的能力直接决定了你的生存质量。早安去行动,让我们释放掉头脑里的担忧和焦虑每日能量调频共修打卡功课去行动,让我们释放掉头脑里的担忧和焦虑行这样一个词,是我们在成事之前的必要前提。这是一定的。所以改掉我们懒惰的习性,行动起来,你一定会拿到属于你的果实,收获全新阵容首次亮相,一年级生准绝杀助上海男篮季前赛一分险胜山西新赛季阵容继续升级的上海大鲨鱼男篮,今天第一次正式亮相,出现在了CBA的季前赛中。凭借着新人刘礼嘉在全场比赛结束前2。2秒的准绝杀,大鲨鱼9998战胜了山西男篮,取得开门红。202养老金重算补发已定,2类人养老金补发月数最多,看看有你吗点击上方蓝色按钮,可同步收听全文精彩内容养老金重算补发已定,2类人养老金补发月数最多,看看有你吗?目前我国退休人员包括机关事业单位退休人员和企业职工退休人员,自2014年10月起,全球人民币储备有很大很长远的增长空间综合近期中国央行以及国际货币基金组织的数据来看,人民币储备在全球的普及性非常广泛,已经有80多个外国央行和货币当局将人民币纳入外汇储备,今年二季度末人民币外汇储备总额约为3223。
都说癌症是因为体内寒湿,可是为什么抗癌的中草药大部分都是寒凉?你的问题都说癌症是因为体内寒湿,可为什么抗癌的中草药大部分都是寒凉?赵医生来告诉你癌症并不都是因为体内寒湿,引起癌症的病因是多方面的,它主要包括痰湿凝聚,气滞血瘀,正气亏虚,毒邪内老年人怎么存钱好?老年人怎么存钱好,对于上年纪的老年人来说,个人并不建议选择一些风险比较高的理财产品,因为家庭基本上均以稳定,儿女都已经成家立业家中大小事以及各类生活支出,可以说均是由儿女们来承担,很多明星都改国籍跑外国去了有何看法?梦于现实距离很远,有的人总以为自已到了国外就会看见最大的月亮,抱住最粗大的金柱,可是现实很打脸。明星企业家在国内赚得盆满钵满,这时候就动起了歪脑筋,总想高升自已的各种于人不同的地位CBA之前的台湾队为什么退出了?题主所说的台湾队应该是之前由新浪冠名的新浪狮队,这支球队促进了两岸之间篮球的交流,可以说对于中国篮球发展意义重大。新浪狮队前身是台北宏国象队,之后曾在台湾联赛中夺得季军,综合实力不为什么很多港台明星都不吃肉?港台明星很多都不吃肉,是是为啥呢,其实港台地区以前都比大陆发达,大家都知道发达国家对于健康饮食更加的重视,而且他们大多数都有信仰,一般有信仰的人吃素的比较多,因为他们觉得肉是生命的很少人提到洛阳明星,有哪些明星是洛阳的呢?洛阳的明星有许文广程琳陈明朱军和王一博等人,除了许文广其他几人我在其它问答里面都回复过了,今天就介绍下出生于洛阳的国家一级演员许文广。说许文广你可能不认识,但是说起电视剧人民的名义解散的明星组合有哪些?娱乐圈中很多艺人都是通过组合的形式出道,比如曾经的飞轮海小虎队至上励合等组合。但组合之路并不好走,随着团队的热度上升,组合内成员的个人活动越来越多,合体原本最正常不过的一件事却变得从贵阳走出来的明星有哪些?贵阳明星说多不多,说少也不少,但总体上明星都不太出名,嗯,大体比较低调。宁静堪称贵州籍影视明星中的大姐大!相信你看了下面的介绍,就懂了出生日期1972年4月27日籍贯贵州省贵阳市生如果李唐不是郭京飞演,换个流量明星,对手还会那么好看吗?就冲着郭京飞,谭卓,颜丙燕看的!郭京飞在这部电视剧里,演的太好了,如果换别人的话,那就要看换谁了,我觉得像于和伟柳云龙张译,都能演好,保证不能演砸。因为人们都是冲着演员的表演实力来哪些女明星的穿搭个性又帅气?姑娘们对下面这张图有印象吗?对,他就是焦俊艳!这个镜头中的焦俊艳身穿白衬衫,一头侧分超短发,虽然这个片段里他只是客串,仅短的几个画面就将它的焦灼感表现出来,很有代入感,当我看到的时你毕业于哪所大学,多少分考上的?1995年,坐标浙江杭州,理科高考,满分750,考了648分,居然拿到我们中学第一名!话说那年浙大因为保送生招太多,结果集体被要求参加高考,过重点线就可以录取。我用力考了一把,成绩
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网