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

实现Singleton(代表本质上唯一的系统组件)的三种方法:

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

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

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

 

前两种方法有两点注意:

1. 享有特权的客户端可以通过反射机制调用私有构造器。如果需要抵御这种攻击,可以修改构造器,让它在被要求创建第二个实例的时候抛出异常。

2. 如果要使其变成可序列化的,需要:

(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...
}

 

posted @ 2018-04-04 18:41  逝逝  阅读(113)  评论(0编辑  收藏  举报