研究源碼時候,首先會看到一個類,可是這個類的複雜度以及到底作了什麼,並非很清楚,這裏總結了一些經驗。
1 對象是實體類,仍是抽象類,仍是接口。接口類看有幾個接口以及默認方法,接口越多職責越多,接口參數越多發生耦合可能性越大。抽象類看抽象方法,是不是模板模式,是不是鉤子方法,是不是流程的一部分,看是否提供了相應層級的抽象程度。實體類的話看繼承結構,是否有defalut修飾符,從而是能在包內使用,或者是不是protected,是否爲了給子類繼承用的。若是有內部類,須要看是不是靜態內部,仍是非靜態內部,兩種設計大相徑庭。這裏類,方法,屬性修飾符很是重要。final,protected,static,private等等....
2 對象如何覆寫Object和經典接口。經典方法toString,clone,hashCode,equals方法必看。如何實現經典的接口,如Comparable,Cloneable, Serializable(序列化的transient字段),Iterable接口,這些接口影響了是否能做爲集合的元素或者key使用?原子變量沒有equals和hashcode方法。
3 實例屬性字段。字段越多,狀態越多,維護狀態付出代價越高,從而能夠看出類的複雜度,以及狀態流轉。對象是否有生命週期的概念?是否用了複雜的算法實現邏輯?若是靜態字段過多,是否影響OO?做者自己是否理解OO??
4 如何實例化。是靜態工廠仍是new,仍是便利類實例化?仍是builder?仍是工廠建立?仍是對象池化呢?仍是反射實例化?以及建立代價如何,好比數據庫鏈接建立代價高。effective java第一章+設計模式建立型足矣。
5 如何處理異常。 異常是客戶端使用API的「感到意外的」狀況。方法入口參數校驗,受檢異常仍是非受檢異常?併發包核心異常是中斷異常。InterruptedException很是重要。
6 線程安全。是否不可變,是否有安全和活躍性問題,Integer不可變。
7 對象名字是否恰當和通用。對象名字是否有隱喻,對象是否可擴展,可配置,對象是否依賴過多別的對象致使理解起來複雜,對象到底作了什麼,與別的對象職責是否清晰?
8 是否用了設計模式和Idiom? 是否有領域內通用模式,好比並發領域的:線程池,Mutex,Lock,信號量,閉鎖,條件隊列,阻塞隊列,forkjoin等不區分語言,領域通用,好比IO,這些應該是通用的模式。GOF設計模式分爲三大類,這塊主要考察結構和行爲模式。
9 類的繼承結構。若是類的繼承結構複雜,那麼每一層繼承子類到底實現了什麼功能?是否合理的實現了繼承?Map是接口,AbstractMap實現了骨架是集合框架的核心思路。
10 具體方法實現。 API實現的核心。是否行數太多?是否註釋清晰?(具體沒想好怎麼快速理解)
11 DEMO。看着API是否能夠寫出簡單的DEMO來?是否方便測試?
12 性能如何。 集合的壓力測試能夠看出優化效果。
13 新收穫和反思。是否有新理解,不怕重複看,怕重複沒有新的理解和認識。若是是我,我該如何實現?爲何別人能作到,而我作不到?我該如何改進和超越?是否能夠進一步封裝?是否開源項目已經進一步封裝了?(Guava對於JDK,SpringJDBC+事務對於原生JDK-JDBC的業界經典案例),技術是否有亮點?java