第二章 建立與銷毀物件
1、考慮用靜態工廠方法代替構造器
優點:1、有名稱
2、不必在每次呼叫他們的時候都建立乙個新的物件
3、他們可以返回原返回型別的任何子型別物件
4、使**更簡潔
缺點:1、類如果不含公有的或者受保護的構造器,就不能被子類化
2、與其他的靜態方法實際上沒有任何區別,不能一眼就看出來
可以用一些慣用的名稱:
valueof
ofgetinstance
newinstance
gettype
newtype
關於第三條優點,這種靈活的靜態工廠方法可以構成 服務者提供框架(service provider framework)
/**
* 服務提供者框架
* 多個服務提供者實現乙個服務,系統為服務提供者的客戶端提供多個實現,並把他們從多個實現中解耦出來
*/public class services
private static final string default_provider = "default_provider";
private static final concurrenthashmapproviders = new concurrenthashmap();
/*** 註冊提供者
* @param name
* @param provider
*/public static void registprovider(string name,provider provider)
/*** 註冊預設提供者
* @param provider
*/public static void registdefaultprovider(provider provider)
/*** 提供預設服務
* @return
*/public static service newinstance()
/*** 根據相應條件提供特定服務
* @param name
* @return
*/public static service newinstance(string name)
/*** 服務提供者介面
*/inte***ce provider
/*** 服務介面
*/inte***ce service
}}
/**
* 服務a
*/public class servicea implements services.service
/*** 服務提供者,負責註冊服務,構建服務類
*/static class providera implements services.provider
@override
public void registprovider()
}}/**
* 服務b
*/public class serviceb implements services.service
/*** 服務提供者,負責構建服務 向services類註冊服務
*/static class providerb implements services.provider
@override
public void registprovider()
}}
乙個測試例子
public class client
}
最終列印重疊構造器模式可行,但是當有許多引數的時候,客戶端**會很難編寫,過多的構造器也不利於閱讀i am b
使用構建器,優點
1、客戶端**更加清晰,利於閱讀
2、可以在set方法或者build中對傳入引數進行驗證,及時丟擲異常
乙個簡單的例子
/**
* 不可變類,構造器私有
*/public class service
public bulider setage(int age)
public bulider setheight(int height)
public bulider setweight(int weight)
public service bulider()
}public string tostring()
private service(bulider bulider)
public static void main(string args)
}
Effective java 讀書筆記
一本書看了不少時間,終於這兩天看完了,看的眼睛生疼,估計也就領略了全書1 5的精華。這本書確確實實是本好書,就像剛剛牙牙學語的孩子必須接受父母的教導,電源插頭不可以摸,熱水不可以直接喝等等,很多經驗之談,給人確確實實的思考和應用。盡量多的編碼。如同讀書一樣,沒有一定的 量的積累,很難成為乙個好的程式...
Effective Java讀書筆記二
我們在設計類的時候,有些類難免會有許多的字段 fields 而這些字段可能需要在建立物件的時候對它們進行賦值。一般我們會考慮兩種方式 使用建構函式或者使用setter方法。使用建構函式的缺點很明顯,如果我們的字段過多,那麼就會讓建構函式的引數過多,在這種情況下,不但不容易理解和閱讀,而且非常容易出錯...
Effective Java 讀書筆記 4
23,在新 裡不用使用raw type。用了泛型之後,可以提供編譯時型別檢查,便於及早發現錯誤,從集合裡讀取資料的時候也不用手動的cast。如果真的想向集合裡插入多種型別的資料,可以使用object作為引數型別,比如list這樣的。有點要注意的是class literal不能是泛型,只能有list....