传统单例
首先排除懒汉式写法,因为线程不安全,并且写法很不简洁。
标准:
public class Single{
private static final Single s = new Single();
private Single(){}
public static Single getInstance(){
return s;
}
}
缺点:可以看到这种写法是当类加载时便直接初始化出了对象s,所以你无法自由掌握初始化的时机,它被限定死了。即当类加载的时候jvm里面就有了该类的实例对象
进阶:
public class Single{
private Single(){}
private static class SingleInner{
private static final Single s = new Single();
}
public static final Single getInstance(){
return SingleInner.s;
}
}
优点:利用内部类来生成外部类对象,这种伪懒汉式的方法(外部懒汉,内部饿汉)即避免了线程问题,也解决了想自由控制实例化对象生成时机的需求。
缺点:写法不够简洁。
使用枚举创建单例
public enum Singleton {
INSTANCE;
}
两行代码直接搞定。
枚举中的每个枚举项可看做是一个单例对象,并且自动解决了上面传统写法的所有问题。