【读书笔记 - Effective Java】03. 用私有构造器或者枚举类型强化Singleton属性

实现Singleton(表明本质上惟一的系统组件)的三种方法:性能

1. 保持私有构造器,导出公有的静态成员,客户端访问该类的惟一实例。spa

2. 保持私有构造器,公有的成员是静态工厂方法。code

3. 单元素的枚举类型已经成为实现Singleton的最佳方法对象

 

前两种方法有两点注意:blog

1. 享有特权的客户端能够经过反射机制调用私有构造器。若是须要抵御这种攻击,能够修改构造器,让它在被要求建立第二个实例的时候抛出异常。get

2. 若是要使其变成可序列化的,须要:class

(1) implement Serializable;序列化

(2) 声明全部实例域是瞬时(transient)的;引用

(3) 提供一个返回惟一实例instance的readResolve方法(由于每次反序列化一个序列化的实例时,都会建立一个新的实例)。反射

 

示例1:公有域——性能没有优点,可是组成类的成员声明清楚代表这是一个单例类。公有静态域是final的,老是包含相同的对象引用。

public class Elvis {
    public static final Elvis instance = new Elvis();
    private Elvis() { }
    // method...
}

 

示例2:静态工厂方法——提供了灵活性,改变是不是单例类。可是很容易被修改。

public class Elvis {
    private static final Elvis instance = new Elvis();
    private Elvis() { }
    public static Elvis getInstance() {
        return instance;
    }
    // method...
}

 

示例3:单元素枚举——与公有域方法相近,但没有前面说的两个注意。无偿提供了序列化机制,绝对防止屡次实例化。

public enum Elvis {
    instance;
    // method...
}
相关文章
相关标签/搜索