enum关键字是在Java1.5也就是Java SE5以后引入的一个新特性:它经过关键字enum来定义一个枚举类,这个被定义的枚举类继承Enum类,这个枚举类算是一种特殊类,它一样能像其余普通类同样拥有构造器、方法,也可以实现接口,可是它不能再继承其余别的类,由于它的直接父类是Enum类,而且由于它默认的修饰符有final的存在,所以它没法直接派生出其余子类,除非将其使用abstract修饰。编程
按照《Java编程思想》中的原话来讲:关键字enum能够将一组具名的值的有限集合建立为一种新的类型,而这些具名的值能够做为常规的程序组件来使用。多线程
在枚举类出现以前Java是将常量放在接口或是放在普通类当中,而后使用public、static、final去修饰定义的常量,以下两个例子:app
在枚举类型出现以后,就可使用枚举类型来定义常量,这些枚举类型成员_一、_二、_3都默认被public、static、final修饰,语法以下:spa
可是Java枚举类型输出其常量的时候不像C /C++的枚举那样是数字,输出的是其常量名,若是须要输出其类型成员声明时数字次序的话,须要调用ordinal()方法:线程
单例模式的特色有如下三个:code
- 一、单例类只能有一个实例。
- 二、单例类必须本身建立本身的惟一实例。
- 三、单例类必须给全部其余对象提供这一实例。
咱们能够发现枚举类型十分契合以上三个特色,而且咱们经过建立枚举类型,能够发现它其中每个类型成员其实都是Singleton2这个枚举类的一个实例。对象
public enum Singleton2 { SHERLOCK } class Main{ public static void main(String[] args) { Singleton2 sherlock = Singleton2.SHERLOCK; Singleton2 sherlock1 = Singleton2.SHERLOCK; System.out.println(sherlock == Singleton2.SHERLOCK); System.out.println(sherlock == sherlock1); System.out.println(Singleton2.SHERLOCK.getDeclaringClass()); } } 输出结果: true true class com.sherlock.singleton.Singleton2
利用这个特性,咱们就能够经过以下代码建立单例,同时又由于这个特性,决定了它只能属于饿汉式单例模式blog
public enum Singleton2 { SHERLOCK; public void print() { System.out.println("I am Sherlock!"); } } class Main{ public static void main(String[] args) { Singleton2 sherlock = Singleton2.SHERLOCK; System.out.println(Singleton2.SHERLOCK.getDeclaringClass()); sherlock.print(); } }
输出结果以下: 继承
优势:接口
(1)可以避免多线程同步问题;
(2)可以防止反序列化从新建立对象;
(3)实现比起其它懒汉式、饿汉式单例来讲十分简洁,阅读性好;
缺点:
(1)由于是饿汉式加载,因此会致使枚举实例会长期存在于内存当中;