设为首页 加入收藏

TOP

再谈在Java中使用枚举(1)
2013-10-06 23:51:42 来源: 作者: 【 】 浏览:55
Tags:谈在 Java 使用 枚举

C++(www.cppentry.com)转到Java上的程序员一开始总是对Java有不少抱怨,其中没有枚举就是一个比较突出的问题。那么为什么Java不支持枚举呢?从程序语言的角度讲,支持枚举意味着什么呢?我们能不能找到一种方法满足C++(www.cppentry.com)程序员对枚举的要求呢?那么现在就让我们一起来探讨一下这个问题。

枚举类型(Enumerated Types)

让我们先看下面这一段小程序:

enum Day {SUNDAY, MONDAY, TUESDAY,
WEDNESDAY, THURSDAY, FRIDAY, SATURDAY};

这种申明提供了一种用户友好的变量定义的方法,它枚举了这种数据类型所有可能的值,即星期一到星期天。抛开具体编程(www.cppentry.com)语言来看,枚举所具有的核心功能应该是:

◆类型安全(Type Safety)
◆紧凑有效的枚举数值定义(Compact, Efficient Declaration of Enumerated Values)
◆无缝的和程序其它部分的交互操作(Seamless integration with other language features)
◆运行的高效率(Runtime efficiency)

现在我们就这几个特点逐一讨论一下。

1.类型安全

枚举的申明创建了一个新的类型。它不同于其他的已有类型,包括原始类型(整数,浮点数等等)和当前作用域(Scope)内的其它的枚举类型。当你对函数的参数进行赋值操作的时候,整数类型和枚举类型是不能互换的(除非是你进行显式的类型转换),编译器将强制这一点。比如说,用上面申明的枚举定义这样一个函数:

public void foo(Day);


如果你用整数来调用这个函数,编译器会给出错误的。

foo(4); // compilation error


如果按照这个标准,那么Pascal, Ada, 和C++(www.cppentry.com)是严格意义上的支持枚举,而C语言都不是。

2. 紧凑有效的枚举数值定义

定义枚举的程序应该很简单。比如说,在Java中我们有这样一种“准枚举”的定义方法:

public static final int SUNDAY = 0;
public static final int MONDAY = 1;
public static final int TUESDAY = 2;
public static final int WEDNESDAY = 3;
public static final int THURSDAY = 4;
public static final int FRIDAY = 5;
public static final int SATURDAY = 6;

这种定义就似乎不够简洁。如果有大量的数据要定义,这一点就尤为重要,你也就会感受更深。虽然这一点不如其他另外3点重要,但我们总是希望申明能尽可能的简洁。

3.无缝的和程序其它部分的交互操作

语言的运算符,如赋值,相等/大于/小于判断都应该支持枚举。枚举还应该支持数组下标以及witch/case语句中用来控制流程的操作。比如:

for (Day d = SUNDAY; d <= SATURDAY; ++d) {
switch(d) {
case MONDAY: ...;
break;
case TUESDAY: ...;
break;
case WEDNESDAY: ...;
break;
case THURSDAY: ...;
break;
case FRIDAY: ...;
break;
case SATURDAY:
case SUNDAY: ...;
}
}

要想让这段程序工作,那么枚举必须是整数常数,而不能是对象(objects)。Java中你可以用equals() 或是compareTo()函数来进行对象的比较操作,但是它们都不支持数组下标和switch语句。

内容导航

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇JAVA系统中内存泄漏测试方法的研.. 下一篇避免覆盖通过继承得到的名字(1)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: