Effective Java目錄
建立和銷燬對象
- 考慮用靜態工廠方法代替構造器
- 遇到多個構造器參數時要考慮用構建器
- 用私有構造器或者枚舉類型強化Singleton屬性
- 經過私有構造器強化不可實例化能力
- 避免建立沒必要要的對象
- 消除過時的對象引用
- 避免使用終結方法finalizer
對於全部對象都通用的方法
- 覆蓋equals時請遵照通用約定
- 覆蓋equals時總要覆蓋hashCode
- 始終要覆蓋toString
- 謹慎地覆蓋clone
- 考慮實現Comparable接口
類和接口
- 使類和成員的可訪問性最小化
- 在公有類中使用訪問方法而非公有域
- 使可變性最小化
- 符合優先於繼承
- 要麼爲繼承而設計,並提供文檔說明,要麼禁止繼承
- 接口優於抽象類
- 接口只用於定義類型
- 類層次優於標籤類
- 用函數對象表示策略
- 優先考慮靜態成員類
泛型
- 請不要在新代碼中使用原生態類型(Object、Collection等等,通常使用泛型代替)
- 消除非受檢警告
- 列表優於數組
- 優先考慮泛型
- 優先考慮泛型方法
- 利用有限制通配符來提高API的靈活性
- 優先考慮類型安全的易購容器
枚舉和註解
- 用enum代替int常量
- 用實例域代替序數
- 用EnumSet代替位域
- 用EnumMap代替序數索引
- 用接口模擬可伸縮的枚舉
- 註解優先於命名模式
- 堅持使用Override註解
- 用標記接口定義類型
方法
- 檢查參數的有效性
- 必要時進行保護性拷貝
- 謹慎設計方法簽名
- 慎用重載
- 慎用可變參數
- 返回零長度的數組或者集合,而不是null
- 爲全部導出的API編寫文檔註釋
通用程序設計
- 將局部變量的做用域最小化
- for-each循環優先於傳統的for循環(若是有remove不用for-each)
- 瞭解和使用類庫
- 若是須要精確的答案,請避免使用float和double
- 基本類型優先於裝箱基本類型
- 若是其餘類型更合適,則儘可能避免使用字符串
- 小心字符串連接的性能
- 經過接口引用對象
- 接口優先於反射機制
- 謹慎地使用本地方法
- 謹慎地進行優化
- 遵照廣泛接受的命名慣例
異常
- 只針對異常的狀況才使用異常
- 對可恢復的狀況使用受檢異常,對編程錯誤使用運行時異常
- 避免沒必要要地使用受檢異常
- 優先使用標準的異常
- 拋出與抽象相應的異常
- 每一個方法拋出的異常都要有文檔
- 在細節消息中包含能補貨失敗的信息
- 努力使失敗保持原子性
- 不要忽略異常
併發
- 同步訪問共享的可變數據
- 避免過分同步
- executor和task優先於線程
- 併發工具優先於wait和notify
- 線程安全性的文檔化
- 慎用延遲初始化
- 不要依賴於線程調度器
- 避免使用線程組
序列化
- 謹慎地實現Serializable接口
- 考慮使用自定義的序列化形式
- 保護性地編寫readObject方法
- 對於實例控制,枚舉類型優先於readResolve
- 考慮用序列化代理序列化實例
歡迎關注本站公眾號,獲取更多信息