《Effective Java》 第一講:創建和銷毀對象

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。

一、用靜態工廠方法代替構造器

用靜態工廠的優點 :

1. 方法有名字,更好理解。

2.不必每次調用的時候都創建一個新對象。

3.可以返回原類型的子類型對象,這樣在選擇返回類型的時候有了更大的靈活性。

4。在創建參數化類型的實例的時候,使代碼更簡潔。

?

靜態工廠的缺點:

1.本類如果不含有公有或是受保護的構造器,就不能被子類化。

2.與其它的靜態方法實際上沒有任何區別。

?

二、遇到多個構造參數用構建器

1.實現方式:靜態成員類(靜態內部類)。 public static class Builder { ... }?

客戶端代碼可以簡寫為:Student stu = new Student.Builder?(20 , 10).birthday("1996-10-13").grade("大二").build(); ?

這樣當大多數參數都是可選的時候,與使用傳統的不斷重載的構造器模式相比,使用 builder 模式的客戶端代碼更易于閱讀和理解。構建器也比 java ?beans 更安全。

?

三、用私有構造或者枚舉強化 Singleton屬性

實現1:公有 + 靜態 + final ,如: public static final INSTANCE;

實現2:privatestatic final XxxxINSTANCE = new Xxxx( ) ;

public staticXxxxgetInstance ( ) {returnINSTANCE; }

實現3:單個元素的枚舉類型。

?

四、通過私有構造器強化不可實例化

比如:工具類中的方法都應該是靜態的,工具類不應當被實例化。

?

五、避免創建不必要的對象

1. 能直接賦值就不要new , 如:String ?str = new String("123"?) ,應當寫為 String str =?"123" ;

2. 高頻率使用的代碼可以考慮抽離為一個方法,該方法可以考慮定義為靜態方法

3.優先使用基本類型,而不是包裝類,當心無意識的自動裝箱,會生成不少多余的對象。

?

六、消除過期對象的引用?

1. 所謂的過期引用是指永遠也不會被解除的引用 。比如定義了一個數組,但是其中的部分元素是確定不會被使用的。這種情況視為對象引用 已經過期,就應該清空這些元素,清除這些引用。這樣如果以后又被錯誤的引用 就會立即拋出 NollPointException 。

2. 消除過期引用可幫助防止內存泄露,內存泄露的常見來源是緩存,有時候會把對象的引用 放入到緩存當中,并且長時間遺忘了它,這時就應該考慮緩存中的項是否全都依舊有意義。所以緩存應該不時的清除掉已經無用的項。清除工作可由后臺一個線程來完成。

3. 監聽器和其它回調也有可能導致內存泄露。如果你實現了一個API, 客戶端在API中注冊回調,卻一直沒有顯示的取消注冊,那么除非你采取某些動作,否則它們就會不斷聚集。確保回調立即被當作垃圾回收的最佳方法是保存它們的弱引用,,例如只將它們 保存為WeakHashMap中的鍵。

?

七、避免使用最終方法

1. 最終方法就是 finalize( ) ,垃圾回收方法。原因是不能保證會及時回收,甚至不能保證會被回收(如果未被捕獲的異常在終結過程中被拋出來,那么這種異常可能會被忽略。并且使用終結方法會有嚴重的性能損失。因此,不應該依賴終結方法來更新重要的持久狀態。

2. 應該使用顯示的終止方法,通常與 try - finally 結合使用,以確保及時終止。比如字節流、字符流、數據庫連接等就應該使用顯示的 close 方法。 ?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451395.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451395.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451395.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

外圍功能電路控制 LET′S TRY“嵌入式編程”: 4 of 6

外圍功能電路控制 LET′S TRY“嵌入式編程”: 4 of 6本連載講解作為嵌入式系統開發技術人員所必需具備的單片機的基礎知識。 在《單片機入門(1)~(3)》中,我們一起學習了單片機的硬件和編程語言以及開發環境…

如何防止代碼腐爛

很多團隊都有這個問題,一個項目的代碼本來開始設計得好好的,一段時間以后,代碼就會變得難以理解,難以維護,難以修改。為什么?我一直在思考這個問題。 讓我們先看一個人的情況。 1. 程序員的成長 新手的代碼…

什么是商業智能(BI),以及其與數據分析的區別?

BI(Business Intelligence)即商務智能,它是一套完整的解決方案,用來將企業中現有的數據進行有效的整合,快速準確地提供報表并提出決策依據,幫助企業做出明智的業務經營決策。它是一種產品/服務,…

php課程 4-15 數組遍歷、超全局數組、表單提交數據(多看學習視頻)

php課程 4-15 數組遍歷、超全局數組、表單提交數據(多看學習視頻) 一、總結 一句話總結:超全局數組特別有用,比如$_SERVER可以獲取所有的客戶端訪問服務器的情況。 1、數組遍歷三種方式(最不熟悉的那一種)…

git branch 分支

Git自學之路(四)- git branch 分支 幾乎所有的版本控制系統都以某種形式支持分支。 使用分支意味著你可以把你的工作從開發主線上分離開來,以免影響開發主線。 在很多版本控制系統中,這是一個略微低效的過程——常常需要完全創建一…

軟件工程師的十個“不職業”行為

職業化是軟件工程師的必然選擇。本文根據我在教學和軟件開發管理方面的實踐,列舉幾個軟件工程師“不職業”的行為或習慣,從另外一個側面進一步探討什么是真正的軟件工程師職業化。職業化之于軟件工程師非常重要。因為:軟件是看不見也摸不著的…

fn:substring()函數

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 fn:substring()函數返回字符串中指定開始和結束索引的子串。 語法 fn:substring()函數的語法如下&#xff1a; ${fn:substring(<s…

大數據分析如何創建最佳的移動應用用戶體驗

2019獨角獸企業重金招聘Python工程師標準>>> 如今&#xff0c;越來越多的人使用移動應用程序。而移動應用將在未來成為一個價值數十億美元的產業。大數據可以幫助企業構建最佳的用戶體驗。 多年來&#xff0c;開發移動應用程序的技術一直在不斷發展&#xff0c;這實…

C語言自學的方法

一、C語言入門的基本學習方法 《C語言》的內容很豐富&#xff0c;有的部分涉及到的細節很多&#xff0c;如硬件知識和數據結構知識等&#xff0c;自學時不可能面面俱到&#xff0c;否則必然會顧此失彼&#xff0c;反而抓不住主要矛盾。筆者認為對初學C語言的考生&#xff0c;開…

CAP原理簡單理解

C&#xff1a;集群中所有機器狀態是一致的。 A&#xff1a;客戶端訪問集群中任意一個節點&#xff0c;總能得到"處理成功"的結果。 假設有五個節點&#xff1a;n1~n5 &#xff0c;出現網絡分區被分成兩組&#xff1a;[n1~n2]和[n3~n5]&#xff0c;那么當n1出來客戶端…

Jstorm+Spring+mybatis整合

在現有的jstorm框架下&#xff0c;有一個需求&#xff1a;jstorm要對接mysql數據庫的實時讀取數據&#xff0c; 通過bolt處理&#xff0c;可能要調用service層的框架&#xff0c;最后保存到數據庫。 在網上尋找了一下&#xff0c;發現storm集成spring的資料非常少&#xff0c;有…

無限享受百度文庫,財富值無視

相信大家在百度上找東西時&#xff0c;遇到有的文庫需要財富值&#xff0c;可是自己又沒有&#xff0c;是不是很頭疼啊。請看&#xff1a; 找到自己要的文庫&#xff0c;如我找的文庫鏈接為&#xff1a;http://wenku.baidu.com/view/7db6 ... html?l5.1.5.1&&#xff08;…

JavaScript onerror 事件( window.onerror = )

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 使用 onerror 事件是一種老式的標準的在網頁中捕獲 Javascript 錯誤的方法。 實例 onerror 事件 如何使用 onerror 事件捕獲網頁中的錯誤…

上海云棲:金融政企行業的CDN最佳實踐

2019獨角獸企業重金招聘Python工程師標準>>> 摘要&#xff1a; 在剛剛結束的上海云棲大會飛天技術匯分論壇上&#xff0c;阿里云視頻云產品架構師羅小飛進行了《阿里云CDN——面向金融政企的CDN最佳實踐》主題分享&#xff0c;為上海的嘉賓介紹CDN的解決方案與技術服…

lunix基本命令

安裝lunix 批量創建文件 whoami查看當前用戶 sudo adduser lilei創建用戶 groups lilei 查看用戶所屬用戶組 sudo usermod -G root lilei 賦予root權限 sudo deluser lilei --remove-home ls -l 顯示目錄的文件 ls -a 顯示隱藏文件 PWD 獲取當前目錄 cd .. 返回上層目錄 cd 進入…

開啟Swarm集群以及可視化管理

為什么80%的碼農都做不了架構師&#xff1f;>>> 在搭建的兩臺coreos服務器上開啟swarm集群 前置條件&#xff1a; docker均開啟2375端口同一個局域網內主服務器上安裝Portainer容器安裝Portainer容器執行&#xff1a; docker run -d -p 9000:9000 --restartalways …

python基本語法:序列

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 序列的基本操作&#xff1a; 2.用例&#xff1a; 3.序列包含字符串、元組、列表。

移動互聯網開始降溫:“人才熱”退燒

去年的瘋狂搶人變成了今年的裁員甚至關門歇業&#xff0c;漫天要價變成了工作難找&#xff0c;移動互聯網市場正回歸理性 工作不好找了。 “去年這個時候&#xff0c;一個剛畢業的Android開發工程師&#xff0c;就能輕松拿到七八千一個月&#xff0c;而今年&#xff0c;很難找到…

MAP存儲數據

map可以裝多種類型的值&#xff0c;當然鍵不能重復&#xff0c;值可以重復。可以使用多種類型的父類&#xff0c;來指定值的類型。比如Object是其他類的父類。例如&#xff1a;HashMap<Object,Object>&#xff0c;它的鍵和值都可以存儲多種類型&#xff0c;反正都是Objec…

IMDb、爛番茄、MTC、各種電影行業評分名字整理

這篇不是技術文章&#xff0c;就是對總是看到但是不知道具體是什么的一些電影名詞、評分、來源&#xff0c;學習一下。 IMDb 互聯網電影資料庫&#xff08;Internet Movie Database&#xff0c;簡稱IMDb&#xff09;是一個關于電影演員、電影、電視節目、電視明星和電影制作的在…