singleton指僅僅被實(shí)例化一次的類,singleton通常被用來代表那些本質(zhì)上唯一的>系統(tǒng)組件,比如窗口管理器或者文件系統(tǒng).使類成為singleton會(huì)是他的客戶端測試變得十分困難写隶,因?yàn)闊o法給singleton替換模擬實(shí)現(xiàn)糙箍,除非他實(shí)現(xiàn)一個(gè)充當(dāng)其類型的接口。
singlton
public class Singleton {
private static final Singleton SINGLETON = new Singleton();
private Singleton() {
if(SINGLETON != null){
throw new UnsupportedOperationException("instance is exist");
}
}
public static Singleton getInstance(){
return SINGLETON;
}
}
由于雖然缺少公有的和受保護(hù)的構(gòu)造器檐什,可以保證全局唯一性碴卧,但是享有特權(quán)的客戶端可以借助AccessibleObject.setAccessible方法,通過反射機(jī)制調(diào)用私有構(gòu)造器乃正。于是上述例子中在創(chuàng)建第二個(gè)實(shí)例的時(shí)候拋出異常
- 關(guān)于singleton的序列化后的反序列化
雖然上述寫法已經(jīng)很強(qiáng)大的可以保證單例住册,但是在序列化后的反序列化的情況下,會(huì)獲得一個(gè)新的對象瓮具,
public class Person {
public static void main(String[] args) throws Exception{
Person person =new Person();
person.serializableTest();
}
public void serializableTest() throws Exception{
serializable(Singleton.getInstance(), "test");
Singleton singleton = deserializable("test");
System.out.println(singleton);
System.out.print(singleton.getInstance());
}
//序列化
private void serializable(Singleton singleton, String filename) throws IOException {
FileOutputStream fos = new FileOutputStream(filename);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(singleton);
oos.flush();
}
//反序列化
private <T> T deserializable(String filename) throws IOException,ClassNotFoundException {
FileInputStream fis = new FileInputStream(filename);
ObjectInputStream ois = new ObjectInputStream(fis);
return (T) ois.readObject();
}
}
可以看到這里是兩個(gè)singleton實(shí)例
那么此時(shí)要怎么解決呢荧飞?答案很簡單,只需要在singleton類中添加如下代碼即可
private Object readResolve() {
return SINGLETON;
}
- 利用枚舉來強(qiáng)化Singleton(最佳方案)
利用單元素的枚舉來實(shí)現(xiàn)單例(Singleton)名党,絕對防止多次實(shí)例化
public enum SingletonEnum {
INSTANCE;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
使用
SingletonEnum.INSTANCE.setName("Bob");
System.out.println(SingletonEnum.INSTANCE.getName());
單元素的枚舉已經(jīng)類型已經(jīng)成為實(shí)現(xiàn)Singleton的最佳方法