1、考慮用靜態(tài)工廠方法代替構(gòu)造器
優(yōu)點(diǎn)1:靜態(tài)工程方法有名稱,可以選擇行創(chuàng)建多個實(shí)例箱熬,具有適當(dāng)名稱的靜態(tài)方法更容易使用;
優(yōu)點(diǎn)2:不必每次都創(chuàng)建一個新對象
優(yōu)點(diǎn)3:可以返回原返回類型的任何子類型的對象
優(yōu)點(diǎn)4:在創(chuàng)建參數(shù)化類型實(shí)例的時候褥蚯,可以使代碼變的更加簡潔
Map> m = new HashMap>();
public strtic<K<V> HashMap<K,V> newInstance(){
return new HashMap<K,V>();
}
Map<String,List<String>> m = HashMap.newInstance();
缺點(diǎn)1:如果不含共有或者保護(hù)類型的構(gòu)造器尘执,則不能被子類化
缺點(diǎn)2:與其他靜態(tài)方法實(shí)際上沒有任何區(qū)別。
2温治、遇到多個構(gòu)造器參數(shù)時要考慮使用構(gòu)建器(建造者模式)
? 當(dāng)構(gòu)造器有多個參數(shù)數(shù)戒悠,可以使用JavaBean模式進(jìn)行優(yōu)化卤恳,但是會阻止把類做成不可變的可能(參數(shù)傳遞和構(gòu)造函數(shù)不同步會導(dǎo)致線程不安全)
先調(diào)用類的builder方法創(chuàng)建一個builder拆融,再用setter設(shè)置各個參數(shù)(注意使用return this;可以構(gòu)造參數(shù)鏈)逛艰,最后調(diào)用builder返回一個類
NutritionFacts cocaCola = new NutritionFacts.Buildr(240,8).calories(100).sodium(35).build();
3欠动、使用私有構(gòu)造器或者枚舉類型強(qiáng)化Singleton屬性
單例方法常有三種方式
1)靜態(tài)final屬性域 ? ? ? ? ? ? ? 2)萤厅、靜態(tài)工廠方法 ? ? ? 3)橄抹、包含單元素的枚舉類型
前兩種方式通過借助AccessibleObject.setAccessible方法 同樣可以訪問,而且還是可序列化的
4惕味、通過私有構(gòu)造器強(qiáng)化不可被實(shí)例化的類的特性
避免使用默認(rèn)的構(gòu)造函數(shù)實(shí)例化楼誓,避免子類化訪問。
5名挥、避免創(chuàng)建不必要的對象
String s = new String("test);? 每次調(diào)用都會創(chuàng)建新對象 可用String s = ”test"改進(jìn)
當(dāng)在一項(xiàng)操作中混合使用基本類型與包裝類型時疟羹,包裝類型會自動拆箱處理。
基本情況下禀倔,基本類型已經(jīng)完勝了包裝類型阁猜。但是在如下三個地方,包裝類型的使用會更合理:
1蹋艺、作為集合中的元素剃袍、鍵和值。
2捎谨、在參數(shù)化類型中民效。比如:你不能這樣寫——ArryList,你只能寫ArrayList.
3、在進(jìn)行反射方法的調(diào)用時涛救。
總之畏邢,當(dāng)可以選擇時候,基本類型是要優(yōu)先于包裝類型检吆∈嫖基本類型更加簡單、更加快速蹭沛。