本文将介绍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 创建枚举类型
下面的例子显示了如何创建一个最基本的枚举类型:
|
它包括一个关键字enum ,一个新枚举类型的名字 priority 以及为priority定义的一组值.
在eclipse 3.1平台上,按照下面步骤来生成枚举类型:(eclipse 3.1提供了一个新的枚举类型创建向导(wizard)以方便用户创建枚举类型)
1) file->new->other, 模板列表显示出来.
2) 在模板列表上选中 java->enum, 点击 next 按钮
3) 按图 1填写每一个域 如下:
图 1: eclipse 3.1 枚举类型创建模板
4) 点击 finish 按钮, 生成priority 的类(定义???), 并声明priority 的每一个值,如下图 2所示:(high, medium, low从何而来???)
图 2: 枚举类型priority
(点击查看原图)
在创建枚举类型时,注意几个重要的概念.
所有创建的枚举类型都扩展于 java.lang.enum. enum 是在j2se 5.0 里定义的一个新类, 它本身不是枚举类型.在创建枚举类型时,必须用enum 关键字,不能直接地定义一个继承enum的类来创建一个枚举类型,尽管所有创建的枚举类型实际上都是enum 的子类. 如果直接继承enum, compiler 就会报错(会导致编译错误).如图3 所示
图3. 直接继承enum 类
(点击查看原图)
枚举类型里定义的每一个值都是枚举类型的一个实例,比方说high是priority的一个实例.枚举类型又是扩展于enum. 所以枚举类型的每一个值声明时, 缺省时都将映射到enum(string name, int ordinal) 构造函数中.换句话说,enum priority {high, medium, low } 的实现是调用了下面的enum 构造函数:
清单2 映射的构造函数调用 |
每一个创建的枚举类型都是enum 的子类,除了上面调用父类 enum 的构造函数外,枚举类型可以使用参数为定义一些自己的构造函数.当声明值时,只需调用此枚举类型定义的构造函数,而且不必添加 new 关键字.在清单3里, priority 的一个实例生成,这个实例就是high (38).
|
另外要强调的两点: 一是这些枚举类型的构造函数都是私有的.它是不能被其它的类或者其它的枚举类型调用的. 而且这个私有修饰符是由编译器自动加的,如果我们定义这些构造函数时,在前面加上public 修饰符, 就会导致编译错误, 如下图5所示. 二是变量定义必须在枚举类型值定义之后. 上图中double temperature 必须在枚举类型值定义完了(分号表示枚举类型值定义完了, 如 low(5.2);) 才能声明.
图4. 枚举类型的构造函数是私有的
(点击查看原图)
在j2se 5.0以前,当我们实现一个枚举类时,一般都是把一个整数关联到此枚举类的某一个值的名字,出现的问题是同一个整数可以代表不同枚举类的值. 下面的例子里定义两个枚举类 course and grade 如下:
|
如果开发者误把student1.assigngrade(grade.a)写成student1.assigngrade(course.englishlist); 在编译 阶段是不能发现问题的,如果用j2se 5.0 枚举类型(enum)可以避免这些问题.
图5 枚举类型值的错误声明
(点击查看原图)
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器