前言
從開始學習Android到現在,囫圇吞棗學了許多控件、布局的使用方法和技巧,看了許多相關的文章,也積累了不少項目經驗。藉此通過歸納、總結和梳理相關知識,扎實基礎,進一步提高Android開發技能。學好Android需要扎實的Java功底,所以將本文作為系列文章的開篇。本系列文章面向有一定Android開發經驗的讀者,歡迎交流!
聲明
歡迎轉載,但請保留文章原始出處:)
博客園:http://www.cnblogs.com
農民伯伯: http://over140.cnblogs.com
書籍
《Practical Java 中文版》 03版 侯捷、劉永丹譯
本書和《Effective Java》,對前述重要而基礎的技術細微處有着詳盡、深刻、實用的介紹、剖析和范例,又以獨立條款之姿展現,在內容的扎實度、可讀性及易讀性上的表現均十分良好。
本書圍繞Java編程中遇到的實際問題展開。可以說書中所列專題正是那些令許多Java程序員困惑不已的FAQ。作者擅長采用恰如其分的示例來闡釋問題,以平時的語言娓娓道出中肯的建議。這些建議往往一語中的,能直接融入編程工作中,可見它們確實是出自作者從實踐中獲得的真知灼見。
正文
注意:條目和用語可能與書籍有所出入,但盡量保持原樣加一些自己的理解。
一、一般技術
1. Java唯一一種參數傳遞機制:by value(傳值)。
備注:當參數為對象時,以傳值方式傳遞對象的引用。(個人理解:傳遞指針的拷貝)
2. 對不變的data和object references使用final
備注:當聲明一個對象為final時,不能改變其指向,但能改變其對象的值。
3. 缺省情況下所有非私有(non-private)、非靜態(non-static)函數都可被覆寫。
3.1 如果函數不想被子類覆寫,將函數聲明為final即可。
4. 在數組和Vectors之間慎重選擇。
|
|
數組 |
Vector |
| 存儲數據類型 |
基本類型、引用類型 |
引用類型 |
| 元素默認值 |
Yes |
No |
| 自動改變大小 |
固定不變 |
動態增長 |
| 速度快 |
Yes |
No |
備注: Vector內部實際是以數組實現的。
5. 多態優於instanceof,必要時才使用instanceof。
備注:例如從父類轉型為派生類時,需要使用instanceof。
6. 一旦不需要的對象引用,就將它設為null。
備注:如果局部變量的引用使用完離函數結束前還需要執行較大代碼,可在使用完后設置為null,以便或許能使其在垃圾回收器下次運行時被回收。
二、 對象與相等性
1. 區別 == 和 equals()
備注:請使用 == 測試兩個基本類型是否完全相同,或測試兩個對象引用是否指向同一個對象;使用equals()比較兩個對象的內容是否相等。
2. 不要依賴equals()缺省實現
備注:所有Java對象都隱含繼承了java.lang.Object,默認的equals()只是檢查對象引用是否指向同一個對象。
3. 實現equals()建議:
3.1 請檢查是否等於this
備注:測試是否指向同一個對象
3.2 優先考慮使用getClass()
備注:getClass()返回某個對象的運行期類(runtime class)。確保只有相同class所產生的對象才有機會被視為相等。范例:
@Override
public boolean equals(Object obj) {
if(obj != null && getClass() == obj.getClass()){
// 繼續比較相等性或直接返回true
}
return false;
}
}
備注:當你為一個派生類撰寫equals()時,你必須檢查除java.lang.Object之外所有父類,看看它們是否都實現了equals()。如果有,那么一定要調用super.equals()。
3.4 在equals()函數中謹慎使用instanceof
備注:如果允許派生類和父類進行比較,可能要采用instanceof(getClass()會恆返回false)。注意instanceof類似於is-a語義,需要注意位置,即(子類 instanceof 父類 -> 返回true;反之為false)。
1. 認識異常流程機制
備注:try區段 -> [catch捕獲區段][可選] -> finally終結區段。
2. 處理異常
如果異常產生卻未被捕獲,發生異常的線程將中斷。處理異常:
a). 捕獲並處理它,防止進一步傳播。
b). 捕獲並拋出一個新的異常給調用端。
備注:應確保新拋出的異常包含原異常相關信息,以保證不丟失重要信息。
c). 不捕獲,任其傳播給調用端。
輸出錯誤信息:
a). 日志文件記錄曾經發生過的異常
b). 輸出異常
輸出到標准錯誤串流:如e.printStackTrace()。
3. 防止出現異常覆蓋
備注:如果在catch或finally區段又拋出了未捕獲的異常,新的異常將覆蓋try拋出的異常,只有一個異常可被傳播到調用段。
4. throws子句
備注:提供throws子句的用意在於,提醒函數調用者,告知可能發生的異常。編譯器會強迫調用端捕捉這些被列出的異常,所以不要再開發周期的最后才添加。
如果覆寫對象(某個父類函數)沒有拋出任何異常,那么覆寫函數因為增加了代碼而引發異常,那么你必須在新函數中捕捉異常並處理。
5. 使用finally避免資源泄漏
備注:finally區段代碼無論是否發生異常都將執行,尤其適合維護對象內部狀態和清理non-memory資源。
6. 使用建議:
a). 不要從try區段執行return、break或continue語句離開try區段
備注:如果try區段和finally區段都return 數據,將返回finally區段return的數據。
b). 將try/catch區段置於循環之外
備注:異常對代碼性能產生負面影響
c). 不要將異常用於流程控制
d). 在構造函數中拋出異常
e). 拋出異常之前將對象恢復為有效狀態
備注:考慮下次執行這段代碼時會發生什么事情,代碼是否還能正常運行。
結束
預計本系列前幾篇文章為《Practical Java》和《Effective Java》的讀書筆記,后續內容還在規划當中,也歡迎大家把感興趣的內容反饋給我作為潛在的系列文章。
