网站首页 新闻首页 网页设计图形动画软件编程网站开发办公软件操作系统数据库网络技术认证考试范文资料黑客攻防 书籍教程 进入论坛

Java Enum

http://www.diybl.com/ 2008-3-27  网络 点击:  [ 评论 ]
文章搜索:    【点击打包该文章】

 
本文摘自IBM DW,如有转载,请声明!
枚举类型入门
---- Java 5.0 以类型安全的方式表示常量
Tiger 中的一个重要新特性是枚举构造,它是一种新的类型,允许用常量来表示特定的数据片断,而且全部都以类型安全的形式来表示。Tiger 专家、developerWorks 的多产作者 Brett McLaughlin 将解释枚举的定义,介绍如何在应用程序中运用枚举,以及它为什么能够让您抛弃所有旧的 public static final代码。
您已经知道,Java 代码的两个基本的构造块是 接口。现在 Tiger 又引入了 枚举,一般简称它为 enum。这个新类型允许您表示特定的数据点,这些数据点只接受分配时预先定义的值集合。
当然,熟练的程序员可以用静态常量实现这项功能,如清单 1 所示:
清单 1. public static final 的常量
public class OldGrade {
 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;
}
 
摘者注:下面这段话说明了上述编程的弊端(除了这里所说的内容外,摘者认为如果OldGrade类中只有这些常量的话,应该将其定义为接口,这样可以防止错误的实例化这个类)
然后您就可以让类接受像 OldGrade.B 这样的常量,但是在这样做的时候,请记住这类常量是 Java int 类型的常量,这意味着该方法可以接受任何 int 类型的值,即使它和 OldGrade 中定义的所有级别都不对应。因此,您需要检测上界和下界,在出现无效值的时候,可能还要包含一个 IllegalArgumentException 。而且,如果后来又添加另外一个级别(例如 OldGrade.WITHDREW_PASSING ),那么必须改变所有代码中的上界,才能接受这个新值。
换句话说,在使用这类带有整型常量的类时,该解决方案也许可行,但并不是非常有效。幸运的是,枚举提供了更好的方法。
定义枚举
清单 2 使用了一个可以提供与清单 1 相似的功能的枚举:
清单 2. 简单的枚举类型
package com.oreilly.tiger.ch03;
public enum Grade {
 A, B, C, D, F, INCOMPLETE
};
在这里,我使用了新的关键字 enum ,为 enum 提供了一个名称,并指定了允许的值。然后, Grade 就变成了一个 枚举类型,您可以按清单 3 所示的方法使用它:
清单 3. 使用枚举类型
package com.oreilly.tiger.ch03;
public class Student {
 private Grade grade;
 public void assignGrade(Grade grade) {
    this.grade = grade;
 }
 public Grade getGrade() {
    return grade;
 }
public static void main(String[] args) {
Student std = new Student();
       std.assignGrade(Grade.A);
       System.out.println(std.getGrade());
}
}
用以前定义过的类型建立一个新的枚举( grade )之后,您就可以像使用其他成员变量一样使用它了。当然,枚举只能分配枚举值中的一个(例如, A 、 C 或 INCOMPLETE )。而且,在 assignGrade() 中是没有进行错误检测的代码,也没有考虑边界情况,请注意这是如何做到。
(摘者注:摘者将上面的使用枚举类型的类代码进行了修改,将一些设置学生姓名等内容删除,并将构造函数也删除,只留下对说明枚举类型有作用的代码,并添加了main方法来进行grade的设置和获取并打印,程序执行结果为A,由于使用枚举类型在方法assignGrade的参数中定义的是枚举类型,而不是java的int类型,所以传递的参数必须是枚举类型参数,而枚举类型参数中定义的值都是合法的)。
使用枚举值
迄今为止,您所看到的示例都相当简单,但是枚举类型提供的东西远不止这些。您可以逐个遍历枚举值,也可以在 switch 语句中使用枚举值,枚举是非常有价值的。
遍历枚举值
下面我们用一个示例显示如何遍历枚举类型的值。清单 4 所示的这项技术,适用于调试、快速打印任务以及把枚举加载到集合(我很快将谈到)中的工具:
清单 4. 遍历枚举值
将上面的main方法修改为如下内容:
public static void main(String[] args) {
              for (Grade g : Grade.values()) {
                     System.out.println("Allowed value: ''

如果图片或页面不能正常显示请点击这里 站内搜索:   
上一篇文章:DES&Blowfish SunJCE
下一篇文章:Load Property From XML

文章评论

请您留言