1.effective in java 第一条,尽量用静态方法代替构造器
1.静态工厂不必每次都创建新对象。 如Boolean.valueof(boolean)
## 实例受控的类,确保是singleton(单例),或者是不可实例化的。
单例 singleton 仅被实例化一次的类,
注意确保如下几点
singleton构造方法必须私有,使得无法通过new来生成第二个实例,
确保对象仅有一个,尤其在多线程下用到静态工厂方法
确保反序列化时不会重新创建对象。
多种方法编写单例类对象 (饿汉单例模式)
1. // 静态工厂方法 单例方法1 饿汉单例模式
private static final SingleInstance s = new SingleInstance();
public static SingleInstance getInstance() {
return s;
}
//公有的静态域直接返回单例的对象
2. 静态工厂懒汉模式
// 懒汉模式
private static SingleInstance sss;
// 加锁后导致不必要资源浪费,每次都同步
public synchronized static SingleInstance get() {
if (sss == null) {
sss = new SingleInstance();
}
return sss;
}
3. DLC静态工厂方法,举个标准用法,ImageLoader源码里的
private volatile static ImageLoader instance;
/**
* Returns singleton class instance
*/
public static ImageLoader getInstance() {
if (instance == null) {
synchronized (ImageLoader.class) {
if (instance == null) {
instance = new ImageLoader();
}
}
}
return instance;
}
//代码里通过2次判空来同步必要的情况
// 由于内存模型,静态工厂方法多线程情况下也会有问题,即使用了双重锁定也一样
所以加上修饰符:
volatile 是1.5后优化JAVA内存模型的关键字,DLC标准写法如上,ImageLoader内部就是如此
3. java1.5后可以通过枚举
上述几种情况在反序列化时重新生成对象。只有枚举不会。
4.静态内部类 推荐
5.hashmap里的单例