zoukankan      html  css  js  c++  java
  • JDK1.5新特性(五)……Typesafe Enums

    援引

    Typesafe Enums - This flexible object-oriented enumerated type facility allows you to create enumerated types with arbitrary methods and fields. It provides all the benefits of the Typesafe Enum pattern ("Effective Java," Item 21) without the verbosity and the error-proneness.

    为什么要有枚举

    问题:要定义星期几或性别的变量,该怎么定义?

    假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday = 0;或即使使用常量方式也无法阻止意外。

    枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。

    枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。

    用普通类如何实现枚举功能

    定义一个Weekday的类来模拟枚举功能

    思路:

    将构造函数私有

    将确定的每个元素静态修饰

    如果有方法对于每个元素实现过程都不同,则将该方法定义成抽象方法,这样避免了定义成静态方法后大量的if-else操作判断元素

       1: public abstract class Weekdays {
       2:     private String name;
       3:     
       4:     //设置成静态成员,通过类名调用每个元素
       5:     public static final Weekdays MONDAY = new Weekdays("MONDAY"){
       6:         @Override
       7:         public Weekdays getNextDay() {
       8:             // TODO Auto-generated method stub
       9:             return Weekdays.TUESDAY;
      10:         }
      11:     };
      12:     public static final Weekdays TUESDAY = new Weekdays("TUESDAY"){
      13:         @Override
      14:         public Weekdays getNextDay() {
      15:             // TODO Auto-generated method stub
      16:             return Weekdays.MONDAY;
      17:         }
      18:     };
      19:     
      20:     //私有构造函数,保证不能创建新的实例对象
      21:     private Weekdays(String name){
      22:         this.name = name;
      23:     }
      24:     
      25:     //抽象该方法,通过每个元素自己实现其细节
      26:     abstract Weekdays getNextDay();
      27:     
      28:     @Override
      29:     public String toString() {
      30:         // TODO Auto-generated method stub
      31:         return this.name;
      32:     }
      33:     
      34:     //此处表示不抽象该方法的实现方法
      35:     //可以看到会出现大量的if else
      36:     //非常繁琐
      37:     /*public Weekdays nextDay(){
      38:         if(this == MONDAY){
      39:             return TUESDAY;
      40:         }
      41:         else if(this == TUESDAY){
      42:             return MONDAY;
      43:         }
      44:         return null;
      45:     }*/
      46: }

    枚举的实现以及作用

    那么上面的例子中用普通类实现枚举类显得非常的繁琐,JDK1.5提供了枚举功能,使这样的定义简单方便

    通过枚举实现Weekdays

       1: public enum Weekday {
       2:     MONDAY("MONDAY"){
       3:         @Override
       4:         public Weekday nextDay() {
       5:             // TODO Auto-generated method stub
       6:             return TUESDAY;
       7:         }
       8:     },
       9:     TUESDAY("TUESDAY"){
      10:         @Override
      11:         public Weekday nextDay() {
      12:             // TODO Auto-generated method stub
      13:             return MONDAY;
      14:         }
      15:     };
      16:     private String name;
      17:     
      18:     Weekday(String name){
      19:         this.name = name;
      20:     }
      21:     
      22:     public abstract Weekday nextDay();
      23:     
      24:     @Override
      25:     public String toString(){
      26:         return this.name;
      27:     }
      28: }
     

    枚举的特点

     
    枚举就相当于一个特殊的类,其中每个元素都是一个实例对象

    其中也可以定义构造方法、成员变量、普通方法和抽象方法。

    枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。

    带构造函数的枚举:

    构造方法必须定义成私有的

    通过MONDAY(Var1,Var2)这种形式实现

    枚举元素MONDAY和MONDAY()的效果一样,都是调用默认的构造方法。

    带普通方法的枚举:

    每个元素分别是由枚举类的子类来生成的实例对象,这些子类采用类似内部类的方式进行定义。

    带有抽象方法的枚举:

    通过每个子类元素自己实现,通过MONDAY(){ @Override method }形式实现

  • 相关阅读:
    Linux线程(一)
    模板(一)
    C++基础(八)
    C++基础(七)
    C++基础(六)
    C++基础(五)
    2.C#基础(二)
    1.C#基础(一)
    2.给出距离1900年1月1日的天数,求日期
    网络协议破解 SMTP
  • 原文地址:https://www.cnblogs.com/ShawnWithSmallEyes/p/3453978.html
Copyright © 2011-2022 走看看