整理一下自己effective java
創(chuàng)建 和銷毀對象
- 靜態(tài)工廠方法代替構(gòu)造器
優(yōu)點(diǎn)
- 靜態(tài)工廠方法有名字 衍腥,是客戶端代碼更容易閱讀
- 不必每次都創(chuàng)建一個新對象
- 可以返回任意子類型的對象
- 返回的對象可以在每次調(diào)用下發(fā)生變化取決于參數(shù)值(這應(yīng)該是指內(nèi)部的參數(shù),而不是說的傳遞的參數(shù))
- 方法返回的具體的類可以在編寫該靜態(tài)方法時不存在(第三條)
缺點(diǎn)
- 類中必須有公共構(gòu)造器或者受保護(hù)的構(gòu)造器
- 而是很難找 (名字任意的問題)所以用常用的一些關(guān)鍵字
from of valueof instance create getType newType
場景 - 當(dāng)一個類需要有多個帶有相同的簽名的構(gòu)造器時,就用靜態(tài)工廠替代
- 不想重復(fù)創(chuàng)建某個對象
遇到多個構(gòu)造器參數(shù)的時候用建造者模式(Builder)
構(gòu)造器多個參數(shù) 導(dǎo)致創(chuàng)建錯誤(容易輸錯盹憎,且傳了許多沒意義的參數(shù))
javabean模式中(get set) 導(dǎo)致構(gòu)造過程不一致 ,使類不可能不變
而builder 模式中就沒有這兩種問題用私有構(gòu)造器或枚舉類型強(qiáng)化單列
Singleton通常表示一個無狀態(tài)對象,函數(shù),本質(zhì)唯一的系統(tǒng)組件侨嘀。
兩種實(shí)現(xiàn)
- 構(gòu)造器私有 有一個
private static final
修飾的實(shí)例然后提供一個靜態(tài)的共有返回方法、 - 枚舉類型實(shí)現(xiàn)
public enum Elvis{
INSTANCE;
public void leaveTheBuilding(){
}
}
- 通過私有構(gòu)造器強(qiáng)化不可實(shí)例的類
就是說通過私有構(gòu)造器修飾工具類
優(yōu)先考慮依賴注入引用資源
創(chuàng)建不必要的對象
不可變的對象指域不會發(fā)生變化(用靜態(tài)工廠方法創(chuàng)建)
比如正則里的Pattern對象 捂襟,一旦創(chuàng)建就是不變的咬腕。而且耗費(fèi)較高,因此要緩存起來
優(yōu)先使用基本類型葬荷,當(dāng)心無意識自動裝箱
消除過期的對象引用
例子
手寫的一個棧 (用一個Object[] 數(shù)組來存儲對象涨共,一個int 的值管理 棧頂)
當(dāng)棧再收縮時 應(yīng)該 置為null 否則內(nèi)存泄漏(但類在自己管理內(nèi)存的時候)
weakhashmap 一個對象的生命周期的由外鍵的引用決定時就可用
接口回調(diào) 和監(jiān)聽器 產(chǎn)生的內(nèi)存泄漏避免使用終結(jié)方法 和清除方法
try - with -resource 優(yōu)先于 try - finally
try(Inputstram in =new FileInputStream(path);
OutputStream out = new FileOutPutStream()){
byte[] buf = new byte[BUFFER_SIZE];
int n;
while(n = in.read(buf) >= 0){
out.write(buf,0,n);
}
}