2011年6月28日 星期二

Effective Java 讀書筆記: Item 5 - 避免生成不必要的物件

記錄讀書心得, 內容不一定和書上一致, 有些是我自己的看法。

這一則比較冗, 有許多零碎的小例子:
  • 經典反面例子: 「String s = new String("...");」, 改用「String s = "...";」較好。這讓我相當地不解, 那為什麼需要這種 constructor?
  • immutable 物件較容易避免生成不必要的物件
  • 如同 item 1 所言, 可用 static factory method 避免生成不必要的物件。Integer.valueOf 和 Boolean.valueOf 是典型的例子
  • 若 mutable 物件之後不會再被修改, 也可配合 final 或 static 共用物件 (case by case)
  • 「不再會被修改的 mutable object」的其它例子:
    • 如 adapter pattern 中的 backing object (backing object: 實際提供功能的物件)
    • 對同一實作 Map 的物件呼叫 keySet() 取得的 Set, 雖然是 mutable object, 但它們的內容卻都一致
  • 小心 autoboxing。下面的程式碼生成一萬次不必要的 Long object, 只因為 sum 誤宣告成 "Long"
    Long sum = 0L;
    for (long i=0; i<10000; i++)
        sum += i
    
  • 近代 JVM 的 garbage collection 能力很優異, 除非生成物件成本很貴 (如 database connection), 不然別自己搞 object pool, 提高維護成本而且不見得會變快
  • 這個守則和 item 39 defensive copying 相反, 自行判斷使用時機: 不小心改變物件造成 bug 的成本 vs. 多生成物件增加的時間, 通常是前者比後者慘。這麼說來, 這個守則除提醒一些小細節外, 似乎是寫心酸的啊。

沒有留言:

張貼留言

在 Fedora 下裝 id-utils

Fedora 似乎因為執行檔撞名,而沒有提供 id-utils 的套件 ,但這是使用 gj 的必要套件,只好自己編。從官網抓好 tarball ,解開來編譯 (./configure && make)就是了。 但編譯後會遇到錯誤: ./stdio.h:10...