昨晚再翻看到的, 和enum有關。 Singleton的2種常見寫法和bob的新寫法一般人都應該很熟悉了。但是如果類實現了序列化接口則會有所不同,如下面代碼。
因為存在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而已,這些老外有時候也挺無聊的。
?1
public?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
}



?2

?3



?4

?5



?6



?7

?8

?9



10

11

12

因為存在nontransient 的屬性,則hacker可以通過反序列化的方式獲得singleton的多個實例。 所以老Bloch說,最好的Singleton模式還是用enum。也真難為他了,這都想的出來。
其實現在一般應用,因為spring的普及,在語法層面上去實現singleton已經不是一個好模式了。
在java one 2008里面的另外一個session 就專門對這個問題做了討論,利用接口和injection的方式進行改良,可以解決 singleton不利于測試的問題。
































soso而已,這些老外有時候也挺無聊的。