说说Java中的枚举——就是一个类

 到目前为止,我们仅仅使用了最简单的语法定义枚举类型,其实枚举类型可以做更多的事情,在Tiger的定义中,枚举是一种新的类型,允许用常量来表示特定的数据片断,它能胜任普通类的大部分功能,如定义自己的构造函数、方法、属性等等。这也是Java与C/C++或是Pascal中不同的地方,在那两种语言中枚举类型代表的就是一些int类型的数字,但在Java中枚举更像是一个类。

    接下来我们将丰富一下我们的枚举类型。

    我们在定义枚举一文中定义了包含五个工作日的枚举类型,但是真正在每个工作日进行操作的动作是在其它类中的printWeekDay方法中进行的。假设我们经过分析发现对工作日的操作应该属于枚举类型WeekDay的职责,那我们就可以把枚举类型改造如下:

Java代码

public enum WeekDay {

                   MONDAY, TUESDAY, WENSDAY, THURSDAY, FRIDAY;

        

                   /**

                * 根据工作日的不同打印不同的信息。

                */

                   public void printWeekDay(){

                            switch(this){

                                     case MONDAY:

System.out.println(“Today is Monday!”);

break;

                                     case TUESDAY:

System.out.println(“Today is Tuesday!”);

break;

                                     case WENSDAY:

System.out.println(“Today is Wensday!”);

break;

                                     case THURSDAY:

System.out.println(“Today is Thursday!”);

break;    

case FRIDAY:

System.out.println(“Today is Friday!”);

break;    

                                     default:

                                               throw new AssertionError("Unexpected value: " + this);

                            }

                   }

}

//测试程序

for(WeekDay weekDay: EnumSet.allOf(WeekDay.class)){

                   System.out.println("the message is : "+weekDay.printWeekDay());

         }

    现在的枚举类型Operation变得丰满多了,我们在枚举类型WeekDay中增加了一个printWeekDay方法,你也可以用WeekDay.MONDAY.printWeekDay()方法来进行信息的输出了。

    枚举类型也允许定义自己的构造函数,这使得枚举常量可以初始化更多的信息。来看看我们在EnumMap与EnumSet一文中提到过的枚举类型DataBaseType,它存放了现在支持的所有数据库类型。但它仅是一个“代号”,由于和数据库相关的信息对于一个应用程序来说是固定不变的,所以把这些数据放置在枚举类型自身中更符合设计的习惯。

Java代码

public enum DataBaseType{

        

                   MYSQL("com.mysql.jdbc.Driver", "jdbc:mysql://localhost/mydb"),

                   ORACLE("oracle.jdbc.driver.OracleDriver",

                                     "jdbc:oracle:thin:@localhost:1521:sample"),

                   DB2("com.ibm.db2.jdbc.app.DB2Driver",

                                     "jdbc:db2://localhost:5000/sample"),

                   SQLSERVER("com.microsoft.jdbc.sqlserver.SQLServerDriver",

                                     "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb");

        

                   private String driver;

        

                   private String url;

                   //自定义的构造函数,它为驱动、URL赋值

                   DataBaseType(String driver,String url){

                            this.driver = driver;

                            this.url = url;

                   }

                   /**

                * 获得数据库驱动

                * @return

              */

                public String getDriver() {

                            return driver;

                }

                   /**

                * 获得数据库连接URL

                * @return

                */

                   public String getUrl() {

                            return url;

                   }

}

//测试程序

for(DataBaseType dataBaseType: EnumSet.allOf(DataBaseType.class)){

                   System.out.println("the driver is : "+dataBaseType.getDriver());

                   System.out.println("the url is : "+dataBaseType.getUrl());

         }

    你注意到例子中的枚举常量是如何声明使用自定义构造函数初始化的吗?仅需要将初始化使用的数据放入在枚举常量名称后面的括号中就可以了。

    现在我们设计出了两个内容丰富的枚举类型,对枚举类型的使用也变得自然了许多。你也许觉得枚举类型和类之间差别甚微。可是毕竟枚举类型有着诸多限制,你在实现自己的枚举类型时一定要遵循它们。

    1. 枚举类型不能使用extends关键字,但是可以使用implements关键字。这样我们可以把不同枚举类型共有的行为提取到接口中,来规范枚举类型的行为。

    2. 枚举类型的自定义构造函数并不能覆盖默认执行的构造函数,它会跟在默认构造函数之后执行。

    3. 枚举类型的自定义构造函数必须是私有的。你不需要在构造函数上添加private关键字,编译器会为我们代劳的。

    4. 枚举类型中枚举常量的定义必须放在最上面,其后才能是变量和方法的定义。

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

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

你可能感兴趣的:(说说Java中的枚举——就是一个类)