文章詳情頁(yè)
Effective java學(xué)習(xí)筆記2:使用私有構(gòu)造函數(shù)來(lái)強(qiáng)化單態(tài)性
瀏覽:35日期:2024-06-18 18:38:36
內(nèi)容: 單態(tài)性是什么?這里做一下簡(jiǎn)單的介紹: Singleton模式主要作用是保證在Java應(yīng)用程序中,一個(gè)類(lèi)Class只有一個(gè)實(shí)例存在。 在很多操作中,比如建立目錄 數(shù)據(jù)庫(kù)連接都需要這樣的單線(xiàn)程操作。還有, singleton能夠被狀態(tài)化; 這樣,多個(gè)單態(tài)類(lèi)在一起就可以作為一個(gè)狀態(tài)倉(cāng)庫(kù)一樣向外提供服務(wù),比如,你要論壇中的帖子計(jì)數(shù)器,每次瀏覽一次需要計(jì)數(shù),單態(tài)類(lèi)能否保持住這個(gè)計(jì)數(shù),并且能synchronize的安全自動(dòng)加1,如果你要把這個(gè)數(shù)字永久保存到數(shù)據(jù)庫(kù),你可以在不修改單態(tài)接口的情況下方便的做到。 另外方面,Singleton也能夠被無(wú)狀態(tài)化。提供工具性質(zhì)的功能, Singleton模式就為我們提供了這樣實(shí)現(xiàn)的可能。使用Singleton的好處還在于可以節(jié)省內(nèi)存,因?yàn)樗拗屏藢?shí)例的個(gè)數(shù),有利于Java垃圾回收(garbage collection)。我們常常看到工廠模式中類(lèi)裝入器(class loader)中也用Singleton模式實(shí)現(xiàn)的,因?yàn)楸谎b入的類(lèi)實(shí)際也屬于資源 比較通用的兩種實(shí)現(xiàn)單態(tài)的方法:第一種:// Singleton with final field - page 10public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() { // ... } // ... // Remainder omitted public static void main(String[] args) { System.out.println(Elvis.INSTANCE); }}第二種: // Singleton with static factorypublic class Elvis { private static final Elvis INSTANCE = new Elvis(); private Elvis() { // ... } public static Elvis getInstance() { return INSTANCE; } // ... // Remainder omitted public static void main(String[] args) { System.out.println(Elvis.INSTANCE); }}第一種方法顯而易見(jiàn),靜態(tài)的public member Elvis.INSTANCE 永遠(yuǎn)都指向同一個(gè)對(duì)象引用.所以,很容易就保持了單態(tài).第二種方法有更強(qiáng)的擴(kuò)展性,不用更改api,你可以選擇使這個(gè)對(duì)象不成為單態(tài)的.比如:在不同的thread里調(diào)用它,為每一個(gè)thread都生成一個(gè)獨(dú)立的instance.所以,如果你確定你的這個(gè)類(lèi)永遠(yuǎn)都是單態(tài)的,那么就使用第一種方法.如果使用第二種方法,要確保單態(tài),最好能夠?yàn)間etinstance()加上synchronized 屬性.因?yàn)?如果沒(méi)有synchronized,在多線(xiàn)程里面,有可能生成多個(gè)對(duì)象. Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd
標(biāo)簽:
Java
上一條:Effective java學(xué)習(xí)筆記3:用私有構(gòu)造函數(shù)強(qiáng)化不可實(shí)例化能力下一條:Effective java學(xué)習(xí)筆記7:改寫(xiě)equals的時(shí)候遵守約定
相關(guān)文章:
1. 如何使用Docker搭建pypi私有倉(cāng)庫(kù)2. Python私有屬性私有方法應(yīng)用實(shí)例解析3. PHP獲取類(lèi)私有屬性的3種方法4. 使用docker compose安裝harbor私有倉(cāng)庫(kù)的詳細(xì)教程5. 詳解JavaScript私有類(lèi)字段和TypeScript私有修飾符6. Python中私有屬性的定義方式7. Java面向?qū)ο蟪绦蛟O(shè)計(jì):類(lèi)的定義,靜態(tài)變量,成員變量,構(gòu)造函數(shù),封裝與私有,this概念與用法詳解8. python調(diào)用私有屬性的方法總結(jié)9. Vue的全局過(guò)濾器和私有過(guò)濾器的實(shí)現(xiàn)10. Effective java學(xué)習(xí)筆記3:用私有構(gòu)造函數(shù)強(qiáng)化不可實(shí)例化能力
排行榜
