第一种方法:
public class Singleton
{
public static final Singleton INSTANCE = new Singleton();
private Singleton()
{
//do something
}
public void otherMethod()
{
//do something
}
}
第二种方法:
public class Singleton
{
private static final Singleton INSTANCE = new Singleton();
private Singleton()
{
//do something
}
public static Singleton getInstance()
{
return INSTANCE;
}
public void otherMethod()
{
//do something
}
}
第三种方法:用枚举实现,只能在java1.5之后版本中用
public enum Singleton
{
INSTANCE;
public void otherMethod()
{
//do something
}
}
三种方法的比较:
第一种方法的好处在于,非常的直观,public 的静态域清楚的表明是Singleton类是一个单态;
第二种方法的好处在于,静态工厂方法保留了灵活性,可以灵活地在工厂方法里面修改代码,比如改成每个调用这个方法的线程返回一个唯一实例,甚至还可以修改成不返回唯一的实例。
第三种方法,更加简洁,枚举类型保证了Singleton类的唯一性,而且还提供了序列化功能,因为枚举类的基类Enum实现了Serializable接口。
因此Joshua Bloch推荐使用第三种, 他在effective java写道:
“a single-element enum type is the best way to implement a singleton”.