概述
虽然一直知道effective java推荐使用枚举来实现单例,但一直不甚理解。
首先回顾单例模式的三要素
- 私有化构造方法。
- 以自己为实例的静态引用。
- 以自己实例为返回值的公有静态方法。
枚举类
public enum DataSourceEnum {
DATASOURCE;
private DBConnection connection = null;
private DataSourceEnum(){
connection = new DBConnection();
}
public DBConnection getConnection(){
return connection;
}
}
枚举类编译后的文件
使用jad对class文件进行处理可以看见原始面目
public final class DataSourceEnum extends Enum
{
public static DataSourceEnum[] values()
{
return (DataSourceEnum[])$VALUES.clone();
}
public static DataSourceEnum valueOf(String name)
{
return (DataSourceEnum)Enum.valueOf(/enums/DataSourceEnum, name);
}
private DataSourceEnum(String s, int i)
{
super(s, i);
connection = null;
connection = new DBConnection();
}
public DBConnection getConnection()
{
return connection;
}
public static final DataSourceEnum DATASOURCE;
private DBConnection connection;
private static final DataSourceEnum $VALUES[];
static
{
DATASOURCE = new DataSourceEnum("DATASOURCE", 0);
$VALUES = (new DataSourceEnum[] {
DATASOURCE
});
}
}
可以看出来枚举类会创建一个不可变的DataSourceEnum 的类,然后使用静态代码块进行初始化。实际上就相当于饿汉单例模式。