天天看點

EffectiveJava(筆記六) 方法38. 檢查參數的有效性39. 必要時進行保護性拷貝40. 謹慎設計方法簽名41. 慎用重載42. 慎用可變參數43. 傳回零長度的數組或者集合, 而不是null44. 為所有導出的API元素編寫文檔注釋

38. 檢查參數的有效性

就是做參數為null時的處理

39. 必要時進行保護性拷貝

就是不引用傳遞的參數, 而是拷貝一份去使用, 如:

public void test(Integer value) {

Integer valueCopy = Integer.valueOf(value);

}

40. 謹慎設計方法簽名

  • 謹慎地選擇方法的名稱: 方法的名稱應該始終遵循标準的命名習慣, 首要目标應該是選擇易于了解的, 并且風格一緻, 第二個目标應該是選擇與大衆認可的名稱一緻
  • 不要過于追求提供便利的方法: 每個方法都應該盡其所能, 方法太多會使類難以學習、使用、文檔化、測試和維護, 對于類和接口所支援的每個動作, 都提供一個功能齊全的方法, 隻有當一項操作被經常用到的時候, 才考慮為它提供快捷方式
  • 避免過長的參數清單: 目标是最多四個參數, 大多數程式員都無法記住更長的參數清單, 如果參數超過了這個限制, api就不太便利于使用. 有三種方法可以縮短過長的參數清單
    1. 方法分解成多個方法, 每個方法隻需要這些參數的一個子集
    2. 建立輔助類, 用來儲存參數的分組
    3. 結合前兩種方法特征的第三種方法是, 從對象建構到方法調用都采用Builder模式, 定義一個對象表示所有參數, 然後通過Builder模式将參數一一擷取
  • 對于參數類型, 要優先使用接口而不是類: 接口可以多實作, 而類不能多繼承, 接口的适用範圍會更廣
  • 對于boolean參數, 要優先使用兩個元素得問枚舉類型: Boolean.FALSE/Boolean.TRUE

41. 慎用重載

Collection<?>[] collections = {
        new HashSet<String>(),
        new ArrayList<BigInteger>(),
        new HashMap<String, String>().values()
};
for(Collection<?> c : collections) {
    System.out.println(classify(c));
}

public String classify(Set<?> s) {
    return "Set";
}

public String classify(List<?> list) {
    return  "List";
}

public static String classify(Collection<?> c) {
    return "Unknown Collection";
}
           

你可能期望這個程式會列印”Set”, 緊接着是”List”, 以及”Unkown Collection”, 但實際上不是這樣, 它是列印了”Unknown Collection” 三次, 因為classify方法被重載了, 而要調用哪個重載方法是在編譯時做出決定的, 對于for循環中的全部三次疊代, 參數的編譯時類型都是相同的Collection

42. 慎用可變參數

Java 1.5發行版本中增加了可變參數方法, 如:

static int sum(int... args) {
    int sum = 0;
    for(int arg : args) sum += arg;
    return sum;
}
           

這裡的參數組的長度可能為0, 或者長度大于Integer.MAX_VALUE, 是以要做相應的邊界處理

43. 傳回零長度的數組或者集合, 而不是null

對于一個傳回null而不是零長度數組或者集合的方法, 幾乎每次用到該方法時都需要這種曲折的處理方式, 這樣做很容易出錯, 因為編寫用戶端程式的程式員很可能會忘記寫這種專門的代碼來處理null傳回值, 這一點雖然不是特别重要, 但是也值得注意

44. 為所有導出的API元素編寫文檔注釋

如果想要使一個API真正可用, 就必須為其編寫文檔, 傳統意義上的API文檔是手工生産的, 是以保持文檔與代碼同步是一件很繁瑣的事情, Java語言環境提供了一種被稱為Javadoc的實用工具, 進而使這些任務變得很容易, Javadoc利用特殊格式的文檔注釋, 根據源代碼自動産生API文檔, 為完整地描述方法的約定, 方法的文檔注釋應該讓每個參數都有一個@param标簽, 以及一個@return标簽, 以及對于該方法抛出的每個異常, 都有一個@throws标簽, @throws标簽之後的文字應該包含單詞”if”, 緊接着是一個名詞短語, 它描述了這個異常将在什麼樣的條件下會被抛出

文檔注釋中可以使用HTML标簽(<p>和<i>), Javadoc工具會把文檔注釋翻譯成HTML, {@code index<0 || index >= this.size()}, Javadoc的{@code}标簽, 它有兩個作用, 一個是造成該代碼片段以代碼字型進行呈現, 第二種是限制HTML标記和欠條的Javadoc标簽在代碼片段中進行處理, 它允許我們在代碼中使用HTML元字元小于号(<)的東西, Java 1.5之後再也沒有必要再文檔注釋中使用HTML <code>或者<tt>标簽了, Javadoc{@code}标簽更好, 因為它避免了轉義HTML元字元