用私有构造器或者枚举类型强化Singleton属性

用私有构造器或者枚举类型强化Singleton属性

概述

Singleton指仅仅被实例化一次的类。

实现方式

在jsk1.5之前,实现Singleton的两种方式都把构造函数声明为private:

  • 公有静态成员是一个final域
1
2
3
4
5
6
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis() {...}

public void leaveTheBuilding{...}
}

但这种方法存在一个缺点,客户端可以通过反射来生成第二个实例,要避免这种弊端,可以在创建第二个对象的时候抛出异常

  • 公有成员是一个静态工厂方法
1
2
3
4
5
6
7
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis() {...}
public static Elvis getInstance() {return INSTANCE; }

public void leaveTheBuilding{...}
}

jdk1.5发布之后,可以编写一个包含单个元素的枚举类型:

1
2
3
4
5
enum Elvis {
INSTANCE;

public void leaveTheBuilding{...}
}