3.用私有构造器或枚举类型强化SIngleton属性

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

实现Singleton的两种方法:

1.

// Singleton with public final field
public class Elvis {
    public static final Elvis INSTANCE = new Elvis();
    private Elvis() { ... }
    public void leaveTheBuilding() { ... }
}

 

2.

// Singleton with static factory
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() { ... }
public static Elvis getInstance() { return INSTANCE; }
public void leaveTheBuilding() { ... }
}

  注意:可以借助AccessibleOBject.setAccessible方法,通过反射机制访问私有构造器,因此要修改构造器,让它在被要求创建第二个实例时抛出异常

对于序列化:使用以上任何一种方法,如果要实现序列号,不能单单实现序列号接口,还必须声明所有实例域都是瞬时的(transient),并且提供一个readResolve方法,否则每次反序列化的时候都会创建一个新的实例。

3.Java1.5以后还有第三种方法,使用枚举类型来实现

// Enum singleton - the preferred approach
public enum Elvis {
INSTANCE;
public void leaveTheBuilding() { ... }
}
 这种方法更简洁,无偿提供了序列号机制,防止多次实例化,单元素枚举已经成为实现SIngleton的最佳实践。

 

你可能感兴趣的:(Singleton)