枚举与单例和策略

概述
本文深入讲解JAVA1.5新特性之一的枚举,对其概念,应用做了详尽的描述,目的在于帮助学员更好的理解SCJP认证考试中关于枚举的题目,并且在开发中能够灵活使用枚举。本文包括以下内容:
     一.枚举(enum)的概念(枚举是不是类)
     二.为什么要有枚举
     三.枚举与单例模式
     四.枚举与策略模式

一.枚举的概念
      关于枚举的概念,我们可以先提一个问题,对于一切都是类一切都是对象的JAVA语言来说,枚举是不是类?
      enum除了不能继承之外,可以定义构造器,有正常的方法,甚至是抽象方法,因此基本上可以将enum看做一个常规的类。既然可以把它看作是一个常规的类,我们不妨写一个类模拟枚举。 
     本文的案例场景:以我们迈胜(mison)的企业理念以及各个岗位的工作职责为例:

  1. public class Misoner {
  2.         private Misoner() {}
  3.         //讲师
  4.         public static final Misoner TECHNICAL_ADVISER = new Misoner();
  5.         //就业指导
  6.         public static final Misoner EMPLOYMENT_GUIDE = new Misoner();
  7.         //软件外包
  8.         public static final Misoner SOFTWARE_DEVELOPMENT = new Misoner();
  9.         //咨询中心
  10.         public static final Misoner CONSULTING_CENTER = new Misoner();
  11. }
复制代码
这个类跟其他类不一样的地方便是构造器是private的以及对象都是以常量的形式出现,为什么要这么定义?从枚举无法实例化以及通过枚举直接访问元素这两点考虑就不难理解了。接下来我们来看一下上述代码通过枚举怎么实现:
  1. public enum MisonerEnum{
  2.         // 讲师,就业指导中心,软件外包中心,咨询中心
  3.         TECHNICAL_ADVISER, EMPLOYMENT_GUIDE, SOFTWARE_DEVELOPMENT, CONSULTING_CENTER;
  4. }
复制代码
通过枚举实现的代码就简洁很多了。
接下来再提两个问题:
1.枚举的构造器怎么调用?
2.枚举的抽象方法如何实现?

先看第1个问题:
  1. package complex;
  2. public class Misoner {
  3.         private Misoner(String position) {
  4.                 System.out.println("岗位:" + position);
  5.         }
  6.         public static final Misoner TECHNICAL_ADVISER = new Misoner("技术总监");
  7.         public static final Misoner EMPLOYMENT_GUIDE = new Misoner("就业指导");
  8.         public static final Misoner SOFTWARE_DEVELOPMENT = new Misoner("项目经理");
  9.         public static final Misoner CONSULTING_CENTER = new Misoner("咨询顾问");
  10.         
  11. }
复制代码
上面的代码耳熟能详,很容易理解,枚举又如何实现以上代码,如下:
  1. package complex;
  2. public enum MisonerEnum {
  3.         TECHNICAL_ADVISER("技术总监"), EMPLOYMENT_GUIDE("就业指导"), SOFTWARE_DEVELOPMENT(
  4.                         "项目经理"), CONSULTING_CENTER("咨询顾问");
  5.         private MisonerEnum(String position) {
  6.                 System.out.println("岗位:" + position);
  7.         }
  8. }
复制代码
接下来是第2个问题,同样的,我们通过模拟的枚举类和枚举进行比较:
  1. package complex;
  2. public abstract class Misoner {
  3.         private Misoner(String position) {
  4.                 System.out.println("岗位:" + position);
  5.         }
  6.         // 定义内部类对象
  7.         public static final Misoner TECHNICAL_ADVISER = new Misoner("技术总监") {
  8.                 public void work() {
  9.                         System.out.println("讲师提供一流的JAVA技术培训");
  10.                 }
  11.         };
  12.         public static final Misoner EMPLOYMENT_GUIDE = new Misoner("就业指导") {
  13.                 public void work() {
  14.                         System.out.println("就业指导中心帮助学员实现高薪就业");
  15.                 }
  16.         };
  17.         public static final Misoner SOFTWARE_DEVELOPMENT = new Misoner("项目经理") {
  18.                 public void work() {
  19.                         System.out.println("软件外包中心为学员提供商业外包带薪实战");
  20.                 }
  21.         };
  22.         public static final Misoner CONSULTING_CENTER = new Misoner("咨询顾问") {
  23.                 public void work() {
  24.                         System.out.println("咨询中心为学员提供生活学习上的一切服务");
  25.                 }
  26.         };
  27.         //定义抽象方法
  28.         public abstract void work();
  29. }
复制代码
而使用enum的代码如下:
  1. package complex;
  2. public enum MisonerEnum {
  3.         
  4.         TECHNICAL_ADVISER("技术总监") {
  5.                 public void work() {
  6.                         System.out.println("讲师提供一流的JAVA技术培训");
  7.                 }
  8.         }, EMPLOYMENT_GUIDE("就业指导") {
  9.                 public void work() {
  10.                         System.out.println("就业指导中心帮助学员实现高薪就业");
  11.                         
  12.                 }
  13.         }, SOFTWARE_DEVELOPMENT("项目经理") {
  14.                 public void work() {
  15.                         System.out.println("软件外包中心为学员提供商业外包带薪实战");
  16.                         
  17.                 }
  18.         }, CONSULTING_CENTER("咨询顾问") {
  19.                 public void work() {
  20.                         System.out.println("咨询中心为学员提供生活学习上的一切服务");
  21.                 }
  22.         };
  23.         
  24.         private MisonerEnum(String position) {
  25.                 System.out.println("岗位:" + position);
  26.         }
  27.         
  28.         public abstract void work();
  29. }
复制代码

通过模拟的枚举类以及JDK1.5提供的枚举的比较,相信大家对枚举的概念会了然于心,枚举的难点便是构造器以及抽象方法。
原创文章 22 获赞 20 访问量 18万+

猜你喜欢

转载自blog.csdn.net/lw001x/article/details/17439031