《Effective Java 2nd》第8章 通用程序設計
第45條 將局部變量的作用域最小化
for循環優先於while循環
第46條 for-each循環優先於傳統的for循環
for-each循環會隱藏叠代器或者索引變量,可避免出錯。
無法使用for-each的情況:
1)過濾。遍歷集合時,需要刪除指定的元素。需要Iterator的remove方法。
2)轉換。遍歷集合時,替代部分值。
3)平行叠代。同時遍歷多個集合。比如同時遍歷集合A、B,依次比較各個元素。
第47條 了解和使用類庫
每個程序員都應該熟悉java.lang、java.tuil,某些java.io包中的內容。
同時,CollectionFramework和java.util.concurrent包也應該熟悉。
第48條 如果需要精確的答案,避免使用float和double
使用BigDecimal。
第49條 基本類型優先於裝箱基本類型
基本類型優先於裝箱基本類型,如果使用裝箱基本類型時,要特別小心。
基本類型和裝箱基本類型之間的區別:
1)基本類型只有值,而裝箱基本類型具有與值不同的同一性(指引用)
基本類型==比較是比較值。
裝箱基本類型==比較的是引用,equals才是比較的值。
(對裝箱基本類型使用==基本都是錯誤的,這點非常重要,因為比較的是引用!)
2)基本類型只有功能值,而裝備基本類型有非功能值:null
3)基本類型通常比裝箱基本類型更省時間。
當操作中混合使用基本類型和裝箱基本類型時,裝箱基本類型會進行自動拆箱。
如果為null,拆箱時將拋出NullPointerException。
什麽使用應該使用裝箱基本類型
1)作為集合中的元素、鍵值等
2)反射方法調用
第50條 如果其他類型更適合,盡量避免使用字符串
第51條 當心字符串連接的性能
不要使用“+”進行多個字符串的拼接。
1)使用“+”
為連接n個字符串而重復地使用字符串連接操作符,需要n的平方級(n^2)的時間。
由於String的不可變,當兩個字符串拼接時,它們的內容都要被拷貝。
2)使用StringBuilder
為連接n個字符串而重復地使用字符串連接操作符,時間復雜度為O(n)
第52條 通過接口引用對象
如何有合適的接口,應該使用接口聲明。
好處是:程序會更加靈活。
舉例:List<XXX> list = new ArrayList<XXX>();如果list頻繁增加刪除數據,直接將ArrayList改為LinkedList就可以。
不存在合適的接口時,可以用類來引用對象。
1)值類,因值類很少用多個實現編寫,通常是final的。如String、BigInteger。
2)對象屬於某個框架,框架的基本類型是類,而不是接口。這種情況,應該用基類來引用對象,而不是實現類。如java.util.TimerTask
3)類實現了接口,但是提供了接口中不存在的額外方法。如LinkedhashMap。且程序依賴於這些額外方法,則只能使用這個類來引用。
第53條 接口優先於反射機制
本條標題並不能正確反映所將的內容。
接口優先於反射機制:如果程序必須與編譯時未知的類一起工作,如有可能,僅僅用反射進行實例化,訪問對象則使用編譯時已知的某接口或超類。
內容講了使用反射的代價
1)喪失了編譯時類型檢查的好處,包括異常檢查。
2)反射代碼冗長
3)反射比普通方法慢。
第54條 謹慎地使用本地方法
第55條 謹慎地進行優化
1)不要因性能犧牲合理的程序結構。首先要努力編寫好的程序而不是快的程序。
2)在設計系統時,特別是設計API、協議、永久數據格式的時候,考慮性能因素。
3)如果不夠快,找出問題根源,進行優化。
第56條 遵守普遍接受的命名慣例
命名慣例:字面慣例和語法慣例
字面慣例
1)包:com.google.inject
2) 方法或域:HttpServlet
3)常量:字面大寫,用下劃線分隔
4)類型參數。
T表示任意類型。E表示集合元素類型。K、V表示鍵值類型。X表示異常。
語法慣例
1)接口:able結尾表能力
2)特有的方法命名。
轉換對象類型,toType。比如toString,toArray
返回試圖,asType。比如asList
返回與調用對象同值的基本類型,typeValue。比如intValue
靜態工廠常用名稱:valueOf、of、getInstance、newInstance、getType、newType
《Effective Java 2nd》第8章 通用程序設計