`
chinakite
  • 浏览: 124521 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

说说Java中的枚举——JDK1.4之前

阅读更多

在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的。例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集”。在Java中想表示这种数据集最容易想到的写法可能是这样,我们以表示一周五天的工作日来举例:

public class WeekDay {

        public static final int MONDAY = 1;

        public static final int TUESDAY = 2;

        public static final int WENSDAY = 3;

        public static final int THURSDAY = 4;

        public static final int FRIDAY = 5;

}

现在,你的类就可以使用像WeekDay.TUESDAY这样的常量了。但是这里隐藏着一些问题,这些常量是Java中int类型的常量,这意味着该方法可以接受任何int 类型的值,即使它和WeekDay中定义的所有日期都对应不上。因此,您需要检测上界和下界,在出现无效值的时候,可能还要抛出一个IllegalArgumentException。而且,如果后来又添加另外一个日期(例如WeekDay.SATURDAY ),那么必须改变所有代码中的上界,才能接受这个新值。 换句话说,在使用这类带有整型常量的类时,这个方案也许可行,但并不是非常有效。

Joshua Bloch老大这时站了出来,在他的著作《Effective Java》中提出了在这样场景下的一种非常好的模式——Type-safe enumeration pattern。这个模式简而言之就是给这样的常量类一个私有的构造方法,然后声明一些public static final的同类型的变量暴露给使用者,例如:

public class WeekDay {

         public static final WeekDay MONDAY = new WeekDay(1);

         public static final WeekDay TUESDAY = new WeekDay(2);

         public static final WeekDay WENSDAY = new WeekDay(3);

         public static final WeekDay THURSDAY = new WeekDay(4);

         public static final WeekDay FRIDAY = new WeekDay(5);

         public int getValue(){

                   return value;

         }

         

         private int value;         

         private WeekDay(int i){

                   this.value = i;

         }

         //other methods...

}

 

这样做的好处是你的程序现在接受的不是int类型的数据了,而是WeekDay的一个预定义好的static final的实例(WeekDay.TUESDAY等),例如:

public void setWeekDay(WeekDay weekDay){...}

 

而这样做也避免了可以随意向方法中传递一个不合法的int型数值(例如-1)而造成程序错误。同时,它还会带来其他的一些好处:由于这些枚举的对象都是一些类的实例,所以在里面放一些需要的属性来存放数据;又由于他们都是单例的,你可以使用equals方法或是==符号来比较它们。

Perfect!

分享到:
评论
1 楼 wyt1213 2011-02-26  
Joshua Bloch就是厉害,换个小思路就ok了

相关推荐

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

     《Java JDK 7学习笔记》是作者多年来教学实践的经验总结,汇集了学员在教学过程中遇到的概念、操作、应用或认证考试上的各种问题及解决方案。  《Java JDK 7学习笔记》详细介绍了JVM、JRE、Java SE API、JDK与IDE...

    Java JDK实例宝典

    全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。 第1章 ...

    走进Java1

    2000年以后,Java持续发展,陆续推出了JDK 1.4、Java 5.0(JDK 5.0)、Java 6(JDK 6)等版本,引入了泛型、枚举、自动装箱拆箱、变量类型推断(var关键字的前身)等重要特性。随着时间的推移,Java逐渐演变为一个...

    Java发展史概述

    随后的JDK 1.1在1997年增加了枚举、内部类和JNI(Java Native Interface),进一步完善了平台。 2000年,Java 2 Platform Standard Edition (J2SE) 1.3发布,引入了增强的内存管理,提高了性能。2002年的J2SE 1.4则...

    魔乐 JAVA 魔乐课堂实战系列

    - **第三阶段(发展期):**从2004年的JDK 1.5到2009年的JDK 1.7,这一时期Java引入了大量的新特性,如泛型、自动装箱/拆箱、枚举类型、注解等,大大增强了Java语言的功能性和灵活性。 #### 三、Java生态系统 Java...

    JDK7-8新特性介绍

    在JDK 7之前,`switch`语句只能用于基本数据类型(如`int`)或枚举类型。现在,`switch`语句也支持字符串类型。这使得代码更加清晰且易于理解。 例如,以下代码展示了如何根据一周中的某一天返回对应的工作日类型:...

    Java的意思及成长过程.docx

    Java的名字来源于印度尼西亚的一个岛屿——爪哇岛,最初的设计者James Gosling等人在开发过程中为了命名而选择了这个单词。 Java语言的特点包括简单性、面向对象、健壮性、安全性和高性能。它采用了类C++的语法,但...

    Java典型模块

    1.2.1 命令行工具——JDK 6.0 1.2.2 安装工具包JDK 1.2.3 设置JDK环境 1.2.4 集成开发环境安装——MyEclipse 8.5 1.2.5 MyEclipse的一些常用操作 1.3 创建和运行Java程序 1.3.1 手工创建、编译和运行Java程序 1.3.2 ...

    Java调用动态库最简便方法.pdf

    - **JDK 1.5特性**:JNative利用了JDK 1.5的新特性(如枚举、静态导入等),因此该组件在JDK 1.4及更低版本中不可用。 #### 总结 通过使用JNative组件,开发者可以更加高效地在Java程序中调用C/C++动态链接库,极大...

    Java开发技术大全 电子版

    1.4一个简单的Java小程序16 1.5本章小结18 第2章Java语言基础19 2.1Java语言的特点19 2.2Java程序的构成21 2.3数据类 型23 2.3.1基本数据类型23 2.3.2常量25 2.3.3变量26 2.3.4整型数据27 .2.3.5浮点型...

    javaSE代码实例

    第16章 多线程——Java中的并发协作 343 16.1 线程的基本知识 343 16.1.1 多线程编程的意义 343 16.1.2 定义自己的线程 344 16.1.3 创建线程对象 345 16.1.4 启动线程 347 16.1.5 同时使用多个线程 ...

Global site tag (gtag.js) - Google Analytics