Java枚举数据类型_第1页
Java枚举数据类型_第2页
Java枚举数据类型_第3页
Java枚举数据类型_第4页
Java枚举数据类型_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

工・背景

在java语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声

明一组具有int常量。之前我们通常利用publicfinalstatic方法定义的

代码如F,分别用1表示春天,2表示夏天,3表示秋天,4表示冬天。

?

1publicclassSeason{

2publicstaticfinalintSPRING=1;

3publicstaticfinalintSUMMER=2;

4publicstaticfinalintAUTUMN=3;

5publicstaticfinalintWINTER=4;

6}

这种方法称作int枚举模式。可这种模式有什么问题呢,我们都用了那么

久了,应当没问题的。通常我们写出来的代码都会考虑它的平安性、易用

性和可读性。首先我们来考虑一下它的类型平安性。当然这种模式不是

类型平安的。比如说我们设计一个函数,要求传入春夏秋冬的某个值。但

是运用int类型,我们无法保证传入的值为合法。代码如下所示:

1privateStringgetChineseSeason(intseason){

2StringBufferresult=newStringBufferQ;

3switch(season){

4caseSeason.SPRING:

5result.append(“春天”);

6break;

7caseSeason.SUMMER:

8result.append("夏天”);

9break;

10caseSeason.AUTUMN:

11result.append("秋天");

12break;

13caseSeason.WINTER:

14result.append("冬天");

15break;

16default:

17result.append("地球没有的季节");

18break;

19}

20returnresult.toStringf);

21}

22

23publicvoiddoSomething(){

24System.out.println(this.getChineseSeason(Season.SPRING));//这是正常

25

26System.out.println(this.getChineseSeason⑸);〃这个却是不正常的场景,:

27担心全问题

程序getChineseSeason(Season.SPRING)是我们预期的运用方法。可

getChineseSeason⑸明显就不是了,而且编译很通过,在运行时会出现

什么状况,我们就不得而知了。这明显就不符合Java程序的类型平安。

接下来我们来考虑一下这种模式的可读性。运用枚举的大多数场合,我都

须要便利得到枚举类型的字符串表达式。假如将int枚举常量打印出来,

我们所见到的就是一组数字,这是没什么太大的用处。我们可能会想到运

用String常量代替int常量。虽然它为这些常量供应了可打印的字符串,

但是它会导致性能问题,因为它依靠于字符串的比较操作,所以这种模式

也是我们不期望的。从类型平安性和程序可读性两方面考虑,int和

String枚举模式的缺点就显露出来了。幸运的是,从Javal.5发行版本

起先,就提出了另一种可以替代的解决方案,可以避开int和String枚举

模式的缺点,并供应了很多额外的好处。那就是枚举类型(enumtype)。

接下来的章节将介绍枚举类型的定义、特征、应用场景和优缺点。

2.定义

枚举类型(enumtype)是指由一组固定的常量组成合法的类型。Java

中山关键字enum来定义一个枚举类型°下面就是java枚举类型的定义。

*

1publicenumSeason{

2SPRING,SUMMER,AUTUMN,WINER;

3}

3.特点

Java定义枚举类型的语句很简约。它有以下特点:

1)运用关键字enum2)类型名称,比如这里的Season3)一串允许的

值,比如上面定义的春夏秋冬四季4)枚举可以单独定义在一个文件中,

也可以嵌在其它Java类中。

除了这样的基本要求外,用户还有一些其他选择

5)枚举可以实现一个或多个接口(Interface)6)可以定义新的变量7)

可以定义新的方法8)可以定义依据详细枚举值而相异的类

4.应用场景

以在背景中提到的类型平安为例,用枚举类型重写那段代码。代码如下:

publicenumSeason{

SPRING(l),SUMMER(2),AUTUMN(3j,WINTER(4);

privateintcode;

privateSeason(intcode)(

this.code=code;

publicintgetCode(){

returncode;

13publicclassUseSeason{

14/**

15*将英文的季节转换成中文季节

16*@paramseason

17*©return

18*/

19publicStringgetChineseSeason(Seasonseason){

20StringBufferresult=newStringBufferQ;

21switch(season){

22caseSPRING:

23result.append/[中文:春天,枚举常量:"+season.name。+数据:"+seas

24break;

25caseAUTUMN:

26result.append/[中文:秋天,枚举常量:"+season.name。+数据:"+seas

27break;

28caseSUMMER:

29result.append/[中文:夏天,枚举常量:"+season.name。+数据:"+seas

30break;

31caseWINTER:

32result.append][中文:冬天,枚举常量:"+season.name。+数据:"+seas

33break;

34default:

35resvdt.append("地球没有的季节"+Q);

36break;

37}

38returnresult.toStringQ;

39}

40

41publicvoiddoSomething(){

42for(Seasons:Season.values()){

43System.out.println(getChineseSeasonfs));//这是正常的场景

44}

45//System.out.println(getChineseSeason(5));

46//此处已经是编译不通过了,这就保证了类型平安

471

48

49publicstaticvoidmain(String[]arg){

50UseSeasonuseSeason=newUseSeasonQ;

51useSeason.doSomething();

52}

53!

[中文:春天,枚举常量:SPRING,数据:1][中文:夏天,枚举常

量:SUMMER,数据:2][中文:秋天,枚举常量:AUTUMN,数据:3][中

文:冬天,枚举常量:WINTER,数据:4]

这里有一个问题,为什么我要将域添加到枚举类型中呢?目的是想将数据

与它的常量关联起来。如1代表春天,2代表夏天。

5.总结

那么什么时候应当运用枚举呢?每当须要一组固定的常量的时候,如一周

的天数、一年四季等。或者是在我们编译前就知道其包含的全部值的集合。

Java1.5的枚举能满意绝大部分程序员的要求的,它的简明,易用的特点

是很突出的。

6.用法

用法一:常量

1publicenumColor{

2RED,GREEN,BLANK,YELLOW

3!

用法二:switch

1enumSignal{

2GREEN,YELLOW,RED

3:

4publicclassTrafficLight{

5Signalcolor=Signal.RED;

6publicvoidchangef){

7switch(color!{

8caseRED:

9color=Signal.GREEN;

10break;

11caseYELLOW:

12color=Signal.RED;

13break;

14caseGREEN:

15color=Signal.YELLOW;

16break;

17!

18(

19}

用法三:向枚举中添加新方法

1publicenumColor{

2RED(“红色",1),GREEN(“绿色",2),BLANK(“白色",3),YELLO(“黄色”,4);

3//成员变量

4privateStringname;

5privateintindex;

6//构造方法

7privateColor(Stringname,intindex){

8this.name=name;

9this.index=index;

10

11//一般方法

12publicstaticStringgetNamefintindex){

13for(Colorc:Color.valuesO){

14if(c.getlndexf)==index){

15return;

16I

17}

18returnnull;

19I

20//getset方法

21publicStringgetNameQ{

22returnname;

23

24publicvoidsetNamefStringname){

25=name;

26}

27publicintgetlndexf){

28returnindex;

29

30publicvoidsetlndex(intindex){

31this.index=index;

32}

33}

用法四:覆盖枚举的方法

?

1publicenumColor{

2RED(“红色”,1),GREEN(“绿色",2),BLANK(“白色",3),YELLO(“黄色”,4);

3//成员变量

4privateStringname;

5privateintindex;

6//构造方法

7privateColor(Stringname,intindex){

8=name;

9this.index=index;

10}

11//覆盖方法

12©Override

13publicStringtoStringO{

14returnthis.index+"_"+;

15!

16}

用法五:实现接口

?

1publicinterfaceBehaviour)

2voidprint();

3StringgetlnfoQ;

4}

5publicenumColorimplementsBehaviour{

6RED(“红色”,1),GREEN(“绿色",2),BLANK(“白色",3),YELLO("黄色”,4);

7//成员变量

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论