e**m在j**a中是什么意思

时间:2021.11.05 发布人:rong168168

e**m在j**a中是什么意思

已解决问题

谷歌rong168168用户在2021.11.05提交了关于“龙应台e**m在j**a中是什么意思”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2025-02-12T02:54:04。希望大家能够帮助她。

详细问题描述及疑问:期待您的答案,感谢你,我会记得你对我的好的 !

希望以下的回答,能够帮助你。

第1个回答

用户名:匿名用户  

E**m类型多械受的介绍

觅类型(E**meratedType)很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中。而这种觅类型的名称则会被定义成独一无二的类型描述符,在这一点上和常量的定义相似。不过相比较常量类型,觅类型可以为申明的变量提供更大的取值范围。

举个例子来说明一下,如果希望为彩虹描来自绘出七种颜色,你可以在J**a程序中通过常量定义方式来实现。

清单1.常量定义

PublicstaticclassRainbo无段互脱示菜罗湖难wColor{

类型不安全

由于颜色常量的对应值是整数形,差范先谈所以程序执行过程中很有可能给颜色变量传入一个任意的整问答数值,导致出现错误。

没有命氧行架长名空间

由于颜色常量只是类的属性,当你使星流培报用的时候不得不通过类来访问继功侵此入河。

一致性差

因为整形觅属于编译期常量,所以编译过程完成后,所有客户端和服务器端引用的地方,会直接将整数值写入。这样,当你修改旧的觅整数值后或者增加新的觅值后,所有引用地方代码都需要重新编译,否则运行时刻就会出现错误。

类型无指意性

跟选供于颜色觅值仅仅是一些无任何含义的整数值,如果在运行期调而计矛继丝免试时候,你就会发现日志中有很多魔术数字,但除了程序员本身,其他人很难渐参毫溶养笑明白其奥秘。

如何定义E**m类型

为了改围垂进J**a语言在这方面的不足战岩弥补缺陷,5.0版本SDK发布时候,在语言层面上增加了觅类型。觅类型的定客白信可雨啊儿节义也非常的简单,用e**m关键字加上名称和大括号包含起来的觅值体即可,例如上面提到的彩虹颜色就可以用新的e**m方式来重新定义:

e**mRainbowCol朝取量规密略标or{RED,ORANGE,Y弦非ELLOW,GREEN,己快连否老额杨措空CYAN,BLUE,PURPLE}从上面的定义形式来看,似乎J**a中的觅类型很简单,但实际上J**a语言规范赋予觅类型的功能非常的强大,它不仅是简单地将整形数值转换成对象,而是将觅类型定义转变成一个完整功能的类定义。这种类型定义的扩展允许开发者给觅类型增加任何方法和属性,也可以实现任意的接口。另外,J**a平台也为E**m类型提供了高质量的实现,比如默认实现Comparable和Serializable接口,让开发者一般情况下不用关心这些细节。

回到本文的主题上来,引入觅类型到底能够给我们开发带来什么样好处呢?一个最直接的益处就是扩大switch语句使用范围。5.0之前,J**a中switch的值只能够是简单类型,比如int、byte、short、char,有了觅类型之后,就可以使用对象了。这样一来,程序的控制选择就变得更加的方便,看下面的例子:

清单2.定义E**m类型

//定义一周七天的觅类型

如何定制E**m类型

除了以上这种最常见的觅定义形式外,如果需要给觅类型增加一些复杂功能,也可以通过类似class的定义来给觅进行定制。比如要给e**m类型增加属性,可以像下面这样定义:

清单3.定制觅类型

//定义RSS(ReallySimpleSyndication)种子的觅类型

如何避免错误使用E**m

不过在使用E**m时候有几个地方需要注意:

e**m类型不支持public和protected修饰符的构造方法,因此构造函数一定要是private或friendly的。也正因为如此,所以觅对象是无法在程序中通过直接调用其构造方法来初始化的。

定义e**m类型时候,如果是简单类型,那么最后一个觅值后不用跟任何一个符号;但如果有定制方法,那么最后一个觅值与后面代码要用分号';'隔开,不能用逗号或空格。

由于e**m类型的值实际上是通过运行期构造出对象来表示的,所以在cluster环境下,每个虚拟机都会构造出一个同义的觅对象。因而在做比较操作时候就需要注意,如果直接通过使用等号(‘==’)操作符,这些看似一样的觅值一定不相等,因为这不是同一个对象实例。

看下面的这个例子:

清单4.避免错误使用E**m示例

//定义一个一周七天的觅类型

clientFridaye**mvalueissameasserver's

通过程序执行结果,我们能够发现在分布式条件下客户端和服务端的虚拟机上都生成了一个觅对象,即使看起来一样的Fri觅值,如果使用等号‘==’进行比较的话会出现不等的情况。而switch语句则是通过equal方法来比较觅对象的值,因此当你的觅对象较复杂时候,你就需要小心override与比较相关的方法,防止出现值比较方面的错误。

E**m相关工具类

JDK5.0中在增加E**m类的同时,也增加了两个工具类E**mSet和E**mMap,这两个类都放在j**a.util包中。E**mSet是一个针对觅类型的高性能的Set接口实现。E**mSet中装入的所有觅对象都必须是同一种类型,在其**,是通过bit-vector来实现,也就是通过一个long型数。E**mSet支持在觅类型的所有值的某个范围中进行迭代。回到上面日期觅的例子上:

e**mWeekDayE**m{Mon,Tue,Wed,Thu,Fri,Sat,Sun}你能够在每周七天日期中进行迭代,E**mSet类提供一个静态方法range让迭代很容易完成:

for(WeekDayE**mday:E**mSet.range(WeekDayE**m.Mon,WeekDayE**m.Fri)){

Mon

E**mSetsubset=E**mSet.of(WeekDayE**m.Mon,WeekDayE**m.Wed);

Mon

清单5.E**mMap示例

//定义一个E**mMap对象,映射表主键是日期觅类型,值是颜色觅类型

清单6.运行结果

Whatistheluckycolortoday?

结束语

E**m类型提出给J**A编程带了了极大的便利,让程序的控制更加的容易,也不容易出现错误。所以在遇到需要控制程序流程时候,可以多想想是否可以利用e**m来实现。