Java Code Review清單
整潔的代碼
清單項目 | 分類 | </tr> </thead>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
使用可以表達實際意圖(Intention-Revealing)的名稱 | 有意義的名稱 | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
每一個概念只用一個詞 | 有意義的名稱 | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
使用方案/問題領域名稱 | 有意義的名稱 | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
類應該是比較小的! | 類 | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
函數應該是比較小的! | 函數 | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
只做一件事 | 函數 | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
DRY(Don’t Repeat Yourself)原則,(拒絕重復) | 函數 | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
用代碼來解釋自己的做法(譯者注:即代碼注釋) | 注釋 | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
確定應用了代碼格式化 | 格式 | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
使用異常而不是返回碼 | 異常 | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
不要返回Null | 異常 | </tr> </tbody> </table>
清單項目 | 分類 | </tr> </thead>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
如果不用于繼承,使類為final | 基礎 | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
避免重復代碼 | 基礎 | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
權限限制:程序應該運行在保證功能正常的最小權限模式下。 | 基礎 | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
最小化類和成員的可訪問性 | 基礎 | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
注釋出安全相關的信息 | 基礎 | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
系統的輸入必須檢查是否有效和在允許范圍內 | 拒絕服務(Denial of Service) | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
避免對于一些不尋常行為的過分日志 | 拒絕服務(Denial of Service) | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
在任何情況下都釋放資源(流,連接等等) | 拒絕服務(Denial of Service) | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
從異常中清除敏感信息(暴露文件路徑,系統內部相關,配置)P | 私密信息(Confidential Information) | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
不要把高度敏感的信息寫到日志 | 私密信息(Confidential Information) | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
考慮把高度敏感的信息在使用后從內存中清除 | 私密信息(Confidential Information) | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
限制包,類,接口,方法和域的可訪問性 | 可訪問性的擴展(Accessibility Extensibility) | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
限制類和方法的可擴展性(通過使它為final) | 可訪問性的擴展(Accessibility Extensibility) | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
檢驗輸入(有效的數據,大小,范圍,邊界情況等等) | 輸入檢驗(Input Validation) | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
把從不可信對象得到的輸出作為輸入來檢驗 | 輸入檢驗(Input Validation) | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
為native方法定義包裝類(而不是定義native方法為pulibc) | 輸入檢驗(Input Validation) | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
把從不可信對象得到的輸出作為輸入來對待 | 可變性 | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
使public static域為final(避免調用方(caller)修改它的值) | 可變性 | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
避免暴露敏感類的構造函數 | 對象構造 | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
避免安全敏感類的序列化 | 序列化反序列化(Serialization Deserialization) | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
通過序列化來保護敏感數據 | 序列化反序列化(Serialization Deserialization) | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
小心地緩存潛在的特權操作結果 | 序列化反序列化(Serialization Deserialization) | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
只有在需要的時候才使用JNI | 訪問限制 | </tr> </tbody> </table>
清單項目 | 分類 | </tr> </thead>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
避免過分的同步 | 并發 | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
保持同步區域比較小 | 并發 | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
知道string連接的性能情況 | 綜合編程 | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
避免創建不需要的對象 | 創建和銷毀對象 | </tr> </tbody> </table>
清單項目 | 分類 | </tr> </thead>|||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
對可以恢復的情況使用已受檢異常(checked exceptions),對于程序錯誤使用運行時異常(runtime exceptions) | 異常 | </tr>|||||||||||||||||||||||||||||
更多地使用標準異常 | 異常 | </tr>|||||||||||||||||||||||||||||
不要忽略異常 | 異常 | </tr>|||||||||||||||||||||||||||||
檢查參數的有效性 | 方法 | </tr>|||||||||||||||||||||||||||||
返回空數組或集合,而不是null | 方法 | </tr>|||||||||||||||||||||||||||||
最小化類和成員的可訪問性 | 類和接口 | </tr>|||||||||||||||||||||||||||||
在pulibc類中,使用訪問器方法(accessor methods)(譯者注:訪問器方法即我們平常用的get/set方法)而不是public域 | 類和接口 | </tr>|||||||||||||||||||||||||||||
最小化本地變量的范圍 | 綜合編程 | </tr>|||||||||||||||||||||||||||||
通過接口引用對象 | 綜合編程 | </tr>|||||||||||||||||||||||||||||
遵循廣泛接受的命名規則 | 綜合編程 | </tr>|||||||||||||||||||||||||||||
避免使用finalizer | 創建和銷毀對象 | </tr>|||||||||||||||||||||||||||||
當你重寫equals時總是重寫hashCode | 綜合編程 | </tr>|||||||||||||||||||||||||||||
總是重寫toString | 綜合編程 | </tr>|||||||||||||||||||||||||||||
使用枚舉來代替int常量 | 枚舉和注解(Annotations) | </tr>|||||||||||||||||||||||||||||
使用標記接口(marker interface)(譯者注:標記接口是一種沒有任何行為的接口,實現它只是為了讓實現類屬于某種類型,如JDK中的Serializable,Cloneable等)來定義類型 | 枚舉和注解(Annotations) | </tr>|||||||||||||||||||||||||||||
對共享可變的數據使用同步訪問 | 并發 | </tr>|||||||||||||||||||||||||||||
使用executors而不是task和thread | 并發 | </tr>|||||||||||||||||||||||||||||
注釋中描述線程安全情況 | 并發 | </tr>|||||||||||||||||||||||||||||
存在有效的JUnit/JBehave測試用例 | 測試 | </tr> </tbody> </table>
清單項目 | 分類 | </tr> </thead>|||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
查看靜態代碼分析器的報告來進行類的添加和修改 | 靜態代碼分析 | </tr> </tbody> </table>