昨晚再翻看到的, 和enum有關(guān)。 Singleton的2種常見寫法和bob的新寫法一般人都應(yīng)該很熟悉了。但是如果類實現(xiàn)了序列化接口則會有所不同,如下面代碼。


?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。也真難為他了,這都想的出來。

其實現(xiàn)在一般應(yīng)用,因為spring的普及,在語法層面上去實現(xiàn)singleton已經(jīng)不是一個好模式了。

在java one 2008里面的另外一個session 就專門對這個問題做了討論,利用接口和injection的方式進(jìn)行改良,可以解決 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而已,這些老外有時候也挺無聊的。