快速业务通道

在Eclipse 3.1中体验J2SE 5.0的新特性: 第一部分 :枚举类型 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
.values()){   process(g); }

我们 把上面的伪代码写成程序在Eclipse3.1上运行,如下图所示,在右下控制平台视图里显示 了运行结果.如果看不见控制平台,点击Window->Other Views->Console, 控制平 台就会出现在右下角.

图6 枚举类型在循环中的应用

在Eclipse 3.1中体验J2SE 5.0的新特性: 第一部分 :枚举类型 - 编程入门网

我们 在使用for/in loop 时要求它的表达式要求必须是数组或者是实现了java.lang.Iterable 的集合,而枚举类型的values()函数返回的就是一个数组.另外循环变量的声明必须是在 loop里, 包括变量类型和变量名.

我们不能在循环里使用一个在循环之外声明的变量.这和J2SE 5.0以前for loop 里用 的循环变量的声明不同.

1.3.2 转换(Switch)

我们常用的一种判断语句就是Switch-case 语句. 在Switch 语句中使用枚举类型,不 仅能简化程序,而且增强了程序的可读性.

清单8.

File1: Task.java public class Task { Priority myPriority; public Task (Priority p) {    myPriority=p; } public Priority getPriority(){    return myPriority; }} File2: TestSwitch.java public class TestSwitch (   Task task = new Task(Priority.Medium);   switch (task.getPriority( )) { case High:     //do case High        break;     case Midum: // fall through to Low     case Low:     //do case Low        break; default: throw new AssertionError("Unexpected enumerated value!");     } }

在Eclipse 3.1中体验J2SE 5.0的新特性: 第一部分 :枚举类型(5)

时间:2011-04-02 IBM 邹青 吴嫣 吴疆

在Switch语句里使用枚举类型时,一定不能在每一个枚举类型值的前面加上枚举类型 的类名,否则编译器就会报错(会导致编译错误???). 我们把上面的程序稍作修改,在 case 语句里加上枚举类型的类名并运行在Eclipse 3.1 平台上. 我们发现Eclipse 的问 题视图里提示case 语句里枚举类型值的前面加上枚举类型的类名是错误的, 如下图8所 示.

图7: case 语句里枚举类型的值

在Eclipse 3.1中体验J2SE 5.0的新特性: 第一部分 :枚举类型 - 编程入门网

原因是J2SE 5.0的实现要求case 语句里每一个枚举类型值是不能有枚举类型类作为前 缀的.前面谈到过每一个枚举类型的值都是枚举类型的一个实例.那么当编译器编译case语 句时, 是如何处理这些实例的? 这有两种情况:如果switch 与枚举类型定义在同一个编 译单元, 第一次编译时一个新表会创建在内存里. 在这个表里, 每一个枚举类型的值都和 它在枚举类型里定义的顺序关联起来. 编译器编译结果就和下面清单9显示的的程序很像. 只不过顺序号没有加到程序里, 而是编译器在表里快速查询. 如果枚举类型被修改或从定 义,表会被更新.

清单 9:

public class TestSwitch (   Task task = new Task();   switch (task.getPriority( )) { case 0:     //do case High        break;     case 1: // fall through to Low     case 2:     //do case Low        break; default: throw new AssertionError("Unexpected enumerated value!");     } }

还有一种经常出现的情况是 switch 与枚举类型定义不是在同一个编译单元.在这种情 况下, 大多数编译器就会把switch-case 语句翻译成一系列的if/else 语句:

清单 10:

Priority tmp = task.getPriority( ); if (tmp == High) //do case High else if (tmp == Midium) else if (tmp == Low)      //do case Low else {     throw new AssertionError("Unexpected enumerated value!"); }

1.3.3 Maps of Enum and Sets of Enum

在J2SE 5.0 的java.util 程序包中提供两个新类:EnumMap 和 EnumSet,这两个类与 枚举类型的结合应用可使以前非常繁琐的程序变得简单方便

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号