枚举和单例 黑马程序员

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------

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

public class Misoner {
        private Misoner() {}
        //讲师
        public static final Misoner TECHNICAL_ADVISER = new Misoner();
        //就业指导
        public static final Misoner EMPLOYMENT_GUIDE = new Misoner();
        //软件外包
        public static final Misoner SOFTWARE_DEVELOPMENT = new Misoner();
        //咨询中心
        public static final Misoner CONSULTING_CENTER = new Misoner();
}
复制代码
这个类跟其他类不一样的地方便是构造器是private的以及对象都是以常量的形式出现,为什么要这么定义?从枚举无法实例化以及通过枚举直接访问元素这两点考虑就不难理解了。接下来我们来看一下上述代码通过枚举怎么实现:
public enum MisonerEnum{
        // 讲师,就业指导中心,软件外包中心,咨询中心
        TECHNICAL_ADVISER, EMPLOYMENT_GUIDE, SOFTWARE_DEVELOPMENT, CONSULTING_CENTER;
}
复制代码
通过枚举实现的代码就简洁很多了。
接下来再提两个问题:
1.枚举的构造器怎么调用?
2.枚举的抽象方法如何实现?
先看第1个问题:
package complex;
public class Misoner {
        private Misoner(String position) {
                System.out.println("岗位:" + position);
        }
        public static final Misoner TECHNICAL_ADVISER = new Misoner("技术总监");
        public static final Misoner EMPLOYMENT_GUIDE = new Misoner("就业指导");
        public static final Misoner SOFTWARE_DEVELOPMENT = new Misoner("项目经理");
        public static final Misoner CONSULTING_CENTER = new Misoner("咨询顾问");
        
}
复制代码
上面的代码耳熟能详,很容易理解,枚举又如何实现以上代码,如下:
package complex;
public enum MisonerEnum {
        TECHNICAL_ADVISER("技术总监"), EMPLOYMENT_GUIDE("就业指导"), SOFTWARE_DEVELOPMENT(
                        "项目经理"), CONSULTING_CENTER("咨询顾问");
        private MisonerEnum(String position) {
                System.out.println("岗位:" + position);
        }
}
复制代码
接下来是第2个问题,同样的,我们通过模拟的枚举类和枚举进行比较:
package complex;
public abstract class Misoner {
        private Misoner(String position) {
                System.out.println("岗位:" + position);
        }
        // 定义内部类对象
        public static final Misoner TECHNICAL_ADVISER = new Misoner("技术总监") {
                public void work() {
                        System.out.println("讲师提供一流的JAVA技术培训");
                }
        };
        public static final Misoner EMPLOYMENT_GUIDE = new Misoner("就业指导") {
                public void work() {
                        System.out.println("就业指导中心帮助学员实现高薪就业");
                }
        };
        public static final Misoner SOFTWARE_DEVELOPMENT = new Misoner("项目经理") {
                public void work() {
                        System.out.println("软件外包中心为学员提供商业外包带薪实战");
                }
        };
        public static final Misoner CONSULTING_CENTER = new Misoner("咨询顾问") {
                public void work() {
                        System.out.println("咨询中心为学员提供生活学习上的一切服务");
                }
        };
        //定义抽象方法
        public abstract void work();
}
复制代码
而使用enum的代码如下:
package complex;
public enum MisonerEnum {
        
        TECHNICAL_ADVISER("技术总监") {
                public void work() {
                        System.out.println("讲师提供一流的JAVA技术培训");
                }
        }, EMPLOYMENT_GUIDE("就业指导") {
                public void work() {
                        System.out.println("就业指导中心帮助学员实现高薪就业");
                        
                }
        }, SOFTWARE_DEVELOPMENT("项目经理") {
                public void work() {
                        System.out.println("软件外包中心为学员提供商业外包带薪实战");
                        
                }
        }, CONSULTING_CENTER("咨询顾问") {
                public void work() {
                        System.out.println("咨询中心为学员提供生活学习上的一切服务");
                }
        };
        
        private MisonerEnum(String position) {
                System.out.println("岗位:" + position);
        }
        
        public abstract void work();
}

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------

 

posted @ 2015-03-12 18:26  gaopeng868988  阅读(242)  评论(0编辑  收藏  举报