`
chinakite
  • 浏览: 122763 次
  • 性别: 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了

相关推荐

Global site tag (gtag.js) - Google Analytics