二十三、在函數的開始檢查參數的有效性
如果函數對參數有要求,例如不接受Null ,不接受負數等等,應該盡可能在函數的最開始給出校驗,如果發(fā)現錯誤拋出異常
二十四、在需要的時候使用保護性拷貝
1,假設類的客戶會盡一切手段來破壞這個類的約束條件,在這樣的前提下,你必須保護性的設計程序。
2,實例
import?java.util.Date;


public?final?class?Period?
{
????private?final?Date?start;
????private?final?Date?end;

????public?Period(Date?start,Date?end)
{

????????if?(start.compareTo(end)>0)
{
????????????throw?new?IllegalArgumentException(start+"after"+end);
????????}
????????this.start?=?start;
????????this.end?=?end;
????}
????//
.other?code
}
//這個函數看似沒有問題,實際上存在著漏洞,如下使用方法
Date?start?=?new?Date();
Date?end?=?new?Date();
Period?p?=?new?Period(start,end);
//如果加上這句,檢驗就失效了。
end.setYear(78);

//為了對應這個問題,更改構造函數:


public?Period(Date?start,Date?end)
{
????this.start?=?new?Date(start.getTime());
????this.end?=?new?Date(end.getTime());

????if?(start.compareTo(end)>0)
{
????????throw?new?IllegalArgumentException(start+"after"+end);
????}
}注意,拷貝要在檢驗之前進行
3,參數類型可以被不可信任方子類化的情形,清不要使用clone方法進行參數的保護化拷貝
二十五、謹慎的設計方法的原型
1,謹慎的選擇方法的名字,一個好的方法名字可以讓人很快記住
2,不要過于追求提供便利的方法,如果方法太多會增加使用者的學習負擔,只有當一個操作被頻繁使用的時候再添加一個對應的方法。
3,避免太長的參數列表,盡量讓你的參數不大于三個
4,對于參數類型,優(yōu)先使用接口,而不是類。
原因:如果使用接口,你可以隨意的替換實現,或者同時存在多個實現。
使用類沒有這個優(yōu)勢。
5,謹慎的使用函數對象(一個類中一堆靜態(tài)函數)
二十六、謹慎的使用重載
1,實例
import?java.util.ArrayList;
import?java.util.Collection;
import?java.util.HashMap;
import?java.util.HashSet;
import?java.util.List;
import?java.util.Set;



public?class?CollectionClassifier?
{

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

????public?static?String?classify(List?s)
{
????????return?"List";
????}

????public?static?String?classify(Collection?s)
{
????????return?"Unknow?Collection";
????}
????

????public?static?void?main(String[]?args)?
{

????????Collection[]?tests?=?new?Collection[]
{
????????????new?HashSet(),
????????????new?ArrayList(),
????????????new?HashMap().values()
????????};

????????for(int?i=0;i<tests.length;i++)
{
????????????System.out.println(classify(tests[i]));
????????}
????}
}結果是打印出三個unknown
這個程序的行為是違反直覺的,對弈重載方法的選擇是靜態(tài)的,而對于被改寫的方法的選擇是動態(tài)的
(這個可以參考我的另一篇文章)2,盡量不要使用兩個參數數目相同的重載方法
如以下兩個重載函數:
test1(String name,String value)
test1(String name,String[] value)
當你調用test1("name",null)的時候就出錯了。