生活随笔
收集整理的這篇文章主要介紹了
完美的单例实现(The Perfect Singleton)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
我經(jīng)常遇到一些這樣的Java程序員,他們不確定應(yīng)該如何恰當(dāng)?shù)膶?shí)現(xiàn)單例模式。
我不考慮在線程的環(huán)境中合適的實(shí)現(xiàn)。但是使用你能在網(wǎng)絡(luò)上找到的大多數(shù)常見(jiàn)的實(shí)現(xiàn)方式,你可以輕松地創(chuàng)建你想要的多種單例實(shí)現(xiàn)。
假設(shè)你有下面這種常見(jiàn)的單例的實(shí)現(xiàn):
| 1 | public?final?class?NonSafeSingleton?implements?Serializable { |
| 2 | ????private?static?final?NonSafeSingleton INSTANCE =?new?NonSafeSingleton(); |
| 3 | ????private?NonSafeSingleton() {} |
| 4 | ????public?static?NonSafeSingleton getInstance() { |
| 5 | ????????return?INSTANCE; |
現(xiàn)在,注意到Serializable?這個(gè)單詞。思考一會(huì)…..你是對(duì)的。如果通過(guò)RMI發(fā)送上邊的代碼,你將會(huì)得到第二個(gè)實(shí)例。它應(yīng)該足夠可以做一些內(nèi)存中的序列化和反序列化操作。你剛剛違反了單例的規(guī)則。那不是很好。但是如何修復(fù)它?通常我會(huì)用兩種方式:
困難的方式(如果你用4或者更老的版本)你需要在你的單例類(lèi)中實(shí)現(xiàn)一個(gè)readResolve方法。這通常用來(lái)重寫(xiě)序列化機(jī)制已經(jīng)創(chuàng)建的內(nèi)容。在這個(gè)方法里返回的是用來(lái)代替來(lái)自序列化的數(shù)據(jù)。這里僅需要返回你的實(shí)例:
| 2 | protected?Object readResolve()?throws?ObjectStreamException { ? ? ? |
簡(jiǎn)單的方式(如果你用5或更新的版本)將你的單例類(lèi)改成枚舉類(lèi)型,然后移除私有構(gòu)造方法和getInstance方法。下面,真的很簡(jiǎn)單。然后你將免費(fèi)得到下面這個(gè):
| 1 | public?enum?SafeSingleton?implements?Serializable { |
當(dāng)你再實(shí)現(xiàn)單例模式時(shí),記住這些。如果你大量的使用RMI,它可以使你的生活更加簡(jiǎn)單。
Reference:?The Perfect Singleton?from our?JCG partner?Marek Piechut?at the?Development world stories.
Related Articles :
- The dreaded double checked locking idiom in Java
- Java Secret: Using an enum to build a State machine
- Dependency Injection – The manual way
- Java Generics Quick Tutorial
- How does JVM handle locks
?
- 轉(zhuǎn)載自?并發(fā)編程網(wǎng) - ifeve.com
總結(jié)
以上是生活随笔為你收集整理的完美的单例实现(The Perfect Singleton)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。