開題
最近看了別人代碼越發(fā)發(fā)現(xiàn)代碼風(fēng)格、健壯性的重要性。往往在一些習(xí)慣中就能消除一些潛在的Bug和對(duì)效率的提高。因此對(duì)《Effective Java》整理一波比較重要的地方,在規(guī)范下自己代碼習(xí)慣。
第二章 創(chuàng)建和銷毀對(duì)象
1.靜態(tài)工廠代替構(gòu)造器
好處:有名稱、可以實(shí)現(xiàn)單例、可以返回子類型、隱藏部分參數(shù)使代碼簡(jiǎn)潔(ThreadPoolExecutor)
應(yīng)用:服務(wù)提供者框架(服務(wù)注冊(cè)接口、服務(wù)實(shí)現(xiàn)接口、服務(wù)調(diào)用接口),JDBC就是其應(yīng)用
缺點(diǎn):在繼承過程中可能丟失、在文檔中與其他靜態(tài)方法不容易區(qū)分
常用命名:valueOf/getInstance/newInstance/getType/newType
2.多構(gòu)造參數(shù)時(shí),用Builder模式
例子:Test t = new Test().width(1).height(2).build();
build()中方法進(jìn)行參數(shù)檢查
應(yīng)用:ES建索引API有用到
3. 枚舉實(shí)現(xiàn)單例
4.只有靜態(tài)方法的工具類,要讓構(gòu)造器私有拒絕實(shí)例化
5.避免不必要對(duì)象
重用不被修改的對(duì)象、優(yōu)先使用基本類型而不是自動(dòng)裝箱、非重量級(jí)對(duì)象(如Connection)就不要用線程池
6.消除過期引用
數(shù)組拋棄list[i--]前記得置為null、弱引用WeakHashMap要常用、緩存LRU定期清楚多余數(shù)據(jù)
7.避免用finalize方法, 因?yàn)椴恢朗裁磿r(shí)候執(zhí)行
自己寫終結(jié)方法(如close方法),并與try-finally聯(lián)用
第三章 所有對(duì)象通用方法
1.覆蓋equals,注意自反性、對(duì)稱性、傳遞性、一致性
對(duì)于子類提供 視圖 來暴露父類來進(jìn)行與父類對(duì)比
//經(jīng)典覆蓋代碼:
public boolean equals(Object obj){
if(obj == this)
return true;
if( !( o instanceof PhoneNumber ) )
return false;
PhoneNumber p = (PhoneNumber)obj;
return p.a == this.a && p.b == this.b;
}
2.覆蓋equals時(shí)注意覆蓋hashCode
原因:保證集合正常使用
equals方法相等,則hashCode一定相等
生成算法:對(duì)每個(gè)變量分別生成散列碼c,再依次調(diào)用
result = 31*result+c
一定用奇數(shù)避免信息丟失,31好處是可以用位移和減法( (i<<5)-i )來提高計(jì)算效率
大對(duì)象可以緩存hash,提高性能
3.始終覆蓋toStrinig,提高程序可讀性
4.盡量別覆蓋clone,自己寫拷貝構(gòu)造器或者拷貝工廠
非要調(diào)用clone方法,務(wù)必在其中調(diào)用super.clone();
5.考慮實(shí)現(xiàn)Comparable接口中compareTo方法,有利于使用排序等功能
a.compaerTo(b),若a>b則返回大于0的值
第四章類和接口
1.類和成員可訪問性最小
默認(rèn)是包私有、成為public就要一直對(duì)他負(fù)責(zé)
子類訪問級(jí)別不可能小于父類
2. 所有成員變量不要公有域,而是用公有方法來代替
3. 可變性最小化,例如String、BIgInteger,因?yàn)榫€程是安全的
實(shí)現(xiàn)策略為:類final,所有域final
若"a"+"b"+"c"..這種產(chǎn)生較多對(duì)象,可以用類似StringBuffer來提高性能
4.復(fù)合優(yōu)于繼承(包括接口),避免了覆蓋問題
除了復(fù)合,還有一個(gè)策略就是使用轉(zhuǎn)發(fā)類,即包裝模式,避免覆蓋繼承類的會(huì)帶來問題
5.要么為繼承而設(shè)計(jì),提供文檔說明,要么就禁止繼承
6.接口優(yōu)于抽象類
接口可以構(gòu)建混合、非層次的類型框架
抽象類優(yōu)點(diǎn):增加方法,不用影響所有實(shí)現(xiàn)類修改
結(jié)合接口和抽象類優(yōu)點(diǎn),來實(shí)現(xiàn)一些基礎(chǔ)類的骨架