2011年7月6日 星期三

Effective Java 讀書筆記: Item 37 - 用 marker interface 定義型別

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

marker interface 是指沒任何 method 的 interface, 充其量是用來表示一種型別, 有填入 meta data 的意味。但 marker interface 不如 annotations 彈性, 擴充 interface 的 method 意味著強迫所有 client code 要改寫, 而 annotations 無此困擾, 可以再擴充屬性。

有了 annotations 後, marker interface 還是有一點好處: 它可以保證在編譯時找出不當的參數傳遞。比方說若 ObjectOutputStream.writeObject() 的參數定義成 Serializable 而不是 Object 的話, 就能保證不會有人用錯 writeObject(), 傳入的物件一定支援 serialization。相對來說, annotations 得在執行時才能偵測到錯誤, 不如編譯時偵錯來得方便。

仔細想想, 之所以會有 annotations vs. maker interface 的 trade-off, 原因是 Java 為了避免多重繼承衍生的問題, 不支援多重繼承, 改用多重實作代替。但不能為 interface 的 method 提供預設行為, 大幅提高擴充 interface 的成本 (必須改寫所有用到的 class)

參考《侵入,无侵入? Annotation vs Interface》的一些例子, 比較明白有些框架會用 marker interface 或 annotations 表示 class 的屬性, 從而影響框架處理物件的方式。Joshua Bloch 強調: 若在使用 annotations 時用到 ElementType.TYPE (表示這個 annotation 只能用在 class、interface、enum), 多想一想是否用 marker interface 更合適。自己沒遇過實例, 還無法體會, 總之就先備忘吧。

沒有留言:

張貼留言

在 Fedora 下裝 id-utils

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