昨晚再翻看到的, 和enum有关。 Singleton的2种常见写法和bob的新写法一般人都应该很熟悉了。但是如果类实现了序列化接口则会有所不同,如下面代码。


 1public class Elvis implements Serializable {
 2    public static final Elvis INSTANCE = new Elvis();
 3    private Elvis() { }
 4    private final String[] favoriteSongs =
 5        "Hound Dog""Heartbreak Hotel" };
 6    public void printFavorites() {
 7        System.out.println(Arrays.toString(favoriteSongs));
 8    }

 9    private Object readResolve() {
10        return INSTANCE;
11    }

12}


因为存在nontransient 的属性,则hacker可以通过反序列化的方式获得singleton的多个实例。 所以老Bloch说,最好的Singleton模式还是用enum。也真难为他了,这都想的出来。

其实现在一般应用,因为spring的普及,在语法层面上去实现singleton已经不是一个好模式了。

在java one 2008里面的另外一个session 就专门对这个问题做了讨论,利用接口和injection的方式进行改良,可以解决 singleton不利于测试的问题。
public interface Singleton {
  Object read();
}

public class SingletonImpl implements Singleton 
  
public Object read() {
    
// nasty database call
  }

}


public class InnocentBystander {
  
private final Singleton singleton;
  
public InnocentBystander(Singleton singleton) {
    
this.singleton = singleton;
  }

  
  
public void something() {
    Object foo 
= singleton.read();
    
// etc
  }

}

soso而已,这些老外有时候也挺无聊的。