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

本文探讨了在JDK1.4之前,Java中使用整型常量作为枚举类型所面临的问题,包括无法有效防止非法值和维护困难等。作者引用了Joshua Bloch在《Effective Java》中提出的类型安全枚举模式,该模式通过私有构造方法和public static final常量来提高枚举类的安全性和易用性。
摘要由CSDN通过智能技术生成
  在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的。例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集”。在 Java 中想表示这种数据集最容易想到的写法可能是这样,我们以表示一周五天的工作日来举例:

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

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

Java代码

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等),例如:

Java代码

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

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

     Prefect!

 

---------------------------------------------------------------------------------------------------    

     系列文章:
     说说Java中的枚举——JDK1.4之前
     说说Java中的枚举——定义枚举
     说说Java中的枚举——简单使用
     说说Java中的枚举——EnumMap与EnumSet
     说说Java中的枚举——就是一个类
     说说Java中的枚举——模板方法
     说说Java中的枚举——反向查找、总结

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值