本文将介绍j2se 5.0中三个比较重要的特性: 枚举类型, 注释类型, 范型, 并在此基础上介绍在如何在eclipse 3.1开发环境中开发枚举类型, 注释类型和范型应用。
j2se 5.0 (tiger)的发布是java语言发展史上的一个重要的里程碑, 是迄今为止在 java 编程方面所取得的最大进步.
j2se 5.0提供了很多令人激动的特性.这些特性包括范型(generics)的支持, 枚举类型(enumeration)的支持, 元数据(metadata)的支持, 自动拆箱(unboxing)/装箱(autoboxing), 可变个数参数(varargs), 静态导入(static imports), 以及新的线程架构(thread framework).
随着j2se 5.0的推出, 越来越多的集成开发环境(ide)支持j2se 5.0的开发. 著名的开源java ide eclipse从3.1m4开始支持j2se 5.0的开发, 目前最新的版本是3.1rc4.
本系列将介绍j2se 5.0中三个比较重要的特性: 枚举类型, 注释类型, 范型, 并在此基础上介绍在如何在eclipse 3.1开发环境中开发枚举类型, 注释类型和范型应用.本文将介绍枚举类型.
1. 枚举类型
1.1枚举类型简介
j2se 5.0 以及之前的jdk有两种基本方法可以来定义新类型:通过classes 以及interface. 对于大部分面向对象编程来说,这两种方法看起来似乎足够了.但是在一些特殊情况下,这些方法就不适合.例如,我们想定义一个类型 priority, 它只能接受 high, medium, low 三种值. 其他任何值都是非法的.j2se 5.0 以前的jdk是可以构造这种类型的,但是需要做很多工作,有可能会带来如不安全(类型安全性问题???)等潜在问题,而j2se 5.0的枚举类型(enum) 能避免这些问题.
eclipse 是java程序员最常用的开发平台,而eclipse 3.1提供对j2se 5.0的支持,它为j2se 5.0的新功能提供了帮助工具.在对枚举类型的支持上,它不仅提供了枚举类型的创建模板,而且为枚举类型的各种开发错误提供错误提示及帮助修改.
本文首先介绍枚举类型的创建基本概念以及如何在eclipse 3.1平台上创建枚举类型,然后我们通过在eclipse 3.1开发环境中的例子来说明枚举类型的应用.
1.2 创建枚举类型
下面的例子显示了如何创建一个最基本的枚举类型:
清单 1. 枚举类型的定义
public enum priority {high, medium, low };
它包括一个关键字enum ,一个新枚举类型的名字 priority 以及为priority定义的一组值.
在eclipse 3.1平台上,按照下面步骤来生成枚举类型:(eclipse 3.1提供了一个新的枚举类型创建向导(wizard)以方便用户创建枚举类型)
1) file->new->other, 模板列表显示出来.
2) 在模板列表上选中 java->enum, 点击 next 按钮
3) 按图 1填写每一个域 如下:

4) 点击 finish 按钮, 生成priority 的类(定义???), 并声明priority 的每一个值,如下图 2所示:(high, medium, low从何而来???)

在创建枚举类型时,注意几个重要的概念.
所有创建的枚举类型都扩展于 java.lang.enum. enum 是在j2se 5.0 里定义的一个新类, 它本身不是枚举类型.在创建枚举类型时,必须用enum 关键字,不能直接地定义一个继承enum的类来创建一个枚举类型,尽管所有创建的枚举类型实际上都是enum 的子类. 如果直接继承enum, compiler 就会报错(会导致编译错误).如图3 所示

枚举类型里定义的每一个值都是枚举类型的一个实例,比方说high是priority的一个实例.枚举类型又是扩展于enum. 所以枚举类型的每一个值声明时, 缺省时都将映射到enum(string name, int ordinal) 构造函数中.换句话说,enum priority {high, medium, low } 的实现是调用了下面的enum 构造函数:
清单2 映射的构造函数调用
new enum< priority >("high", 0);
new enum< priority >("medium", 1);
new enum< priority >("low", 2);
每一个创建的枚举类型都是enum 的子类,除了上面调用父类 enum 的构造函数外,枚举类型可以使用参数为定义一些自己的构造函数.当声明值时,只需调用此枚举类型定义的构造函数,而且不必添加 new 关键字.在清单3里, priority 的一个实例生成,这个实例就是high (38).
清单3.其它构造函数调用
enum priority {
high (38),
medium(36.5),
low (5.2);
double temperature;
priority (double p)
temperature = p;
}
另外要强调的两点: 一是这些枚举类型的构造函数都是私有的.它是不能被其它的类或者其它的枚举类型调用的. 而且这个私有修饰符是由编译器自动加的,如果我们定义这些构造函数时,在前面加上public 修饰符, 就会导致编译错误, 如下图5所示. 二是变量定义必须在枚举类型值定义之后. 上图中double temperature 必须在枚举类型值定义完了(分号表示枚举类型值定义完了, 如 low(5.2);) 才能声明.

在j2se 5.0以前,当我们实现一个枚举类时,一般都是把一个整数关联到此枚举类的某一个值的名字,出现的问题是同一个整数可以代表不同枚举类的值. 下面的例子里定义两个枚举类 course and grade 如下:
清单4.
public class course {
public static final int englishlit = 1;
public static final int calculus = 2;
public static final int musictheory = 3;
public static final int musicperformance = 4;
}
public class grade {
public static final int a = 1;
public static final int b = 2;
public static final int c = 3;
public static final int d = 4;
public static final int f = 5;
public static final int incomplete = 6;
}
如果开发者误把student1.assigngrade(grade.a)写成student1.assigngrade(course.englishlist); 在编译 阶段是不能发现问题的,如果用j2se 5.0 枚举类型(enum)可以避免这些问题.
枚举类型每一个值都是public, static and final的.也就是说,这些值是唯一的而且一旦定义了是不能被重写或修改.而且尽管在枚举类型每一个值声明时没有出现static关键字, 实际上值都是静态的, 而且我们不能在值前面加上static, public,final 修饰符,否则就会出现下图 6的错误.

枚举类型都实现了java.lang.comparable,枚举类型的值是可以比较排序的,排列顺序就是枚举类型定义这些值的顺序.
1.3 枚举类型的应用
下面各小节介绍了枚举类型的各种应用.
1.3.1循环(iteration)
当我们写程序时,常常遇到对数组或列表里的每一个对象进行处理的情况.在j2se 5.0以前,如果要在一个数组或列表里进行轮循时,我们的做法比较繁琐,需要借助java.util.iterator 类, 如下所示:
清单5:
list priorities = priority.values().;
for (iterator iter = priorities.iterator(); iter.hasnext();) {
priority p = (priority) iter.next();
process(p);
}
现在我们可以通过j2se 5.0 的for/in loop和枚举类型一起使用. 这能使以前花很多时间写的程序简单化,如上面清单5的程序可简化为:
清单6:
for (priority g: priority.values()){
process(g);
}
我们把上面的伪代码写成程序在eclipse3.1上运行,如下图所示,在右下控制平台视图里显示了运行结果.如果看不见控制平台,点击window->other views->console, 控制平台就会出现在右下角.

我们在使用for/in loop 时要求它的表达式要求必须是数组或者是实现了java.lang.iterable的集合,而枚举类型的values()函数返回的就是一个数组.另外循环变量的声明必须是在loop里, 包括变量类型和变量名.
我们不能在循环里使用一个在循环之外声明的变量.这和j2se 5.0以前for loop 里用的循环变量的声明不同.
1.3.2 转换(switch)
我们常用的一种判断语句就是switch-case 语句. 在switch 语句中使用枚举类型,不仅能简化程序,而且增强了程序的可读性.
清单8.
fi
闽公网安备 35060202000074号