《Effective Java》 第一讲:创建和销毁对象
前些天發(fā)現(xiàn)了一個巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。點(diǎn)擊跳轉(zhuǎn)到教程。
一、用靜態(tài)工廠方法代替構(gòu)造器
用靜態(tài)工廠的優(yōu)點(diǎn) :
1. 方法有名字,更好理解。
2.不必每次調(diào)用的時候都創(chuàng)建一個新對象。
3.可以返回原類型的子類型對象,這樣在選擇返回類型的時候有了更大的靈活性。
4。在創(chuàng)建參數(shù)化類型的實(shí)例的時候,使代碼更簡潔。
?
靜態(tài)工廠的缺點(diǎn):
1.本類如果不含有公有或是受保護(hù)的構(gòu)造器,就不能被子類化。
2.與其它的靜態(tài)方法實(shí)際上沒有任何區(qū)別。
?
二、遇到多個構(gòu)造參數(shù)用構(gòu)建器
1.實(shí)現(xiàn)方式:靜態(tài)成員類(靜態(tài)內(nèi)部類)。 public static class Builder { ... }?
客戶端代碼可以簡寫為:Student stu = new Student.Builder?(20 , 10).birthday("1996-10-13").grade("大二").build(); ?
這樣當(dāng)大多數(shù)參數(shù)都是可選的時候,與使用傳統(tǒng)的不斷重載的構(gòu)造器模式相比,使用 builder 模式的客戶端代碼更易于閱讀和理解。構(gòu)建器也比 java ?beans 更安全。
?
三、用私有構(gòu)造或者枚舉強(qiáng)化 Singleton屬性
實(shí)現(xiàn)1:公有 + 靜態(tài) + final ,如: public static final INSTANCE;
實(shí)現(xiàn)2:privatestatic final XxxxINSTANCE = new Xxxx( ) ;
public staticXxxxgetInstance ( ) {returnINSTANCE; }
實(shí)現(xiàn)3:單個元素的枚舉類型。
?
四、通過私有構(gòu)造器強(qiáng)化不可實(shí)例化
比如:工具類中的方法都應(yīng)該是靜態(tài)的,工具類不應(yīng)當(dāng)被實(shí)例化。
?
五、避免創(chuàng)建不必要的對象
1. 能直接賦值就不要new , 如:String ?str = new String("123"?) ,應(yīng)當(dāng)寫為 String str =?"123" ;
2. 高頻率使用的代碼可以考慮抽離為一個方法,該方法可以考慮定義為靜態(tài)方法。
3.優(yōu)先使用基本類型,而不是包裝類,當(dāng)心無意識的自動裝箱,會生成不少多余的對象。
?
六、消除過期對象的引用?
1. 所謂的過期引用是指永遠(yuǎn)也不會再被解除的引用 。比如定義了一個數(shù)組,但是其中的部分元素是確定不會被使用的。這種情況視為對象引用 已經(jīng)過期,就應(yīng)該清空這些元素,清除這些引用。這樣如果以后又被錯誤的引用 就會立即拋出 NollPointException 。
2. 消除過期引用可幫助防止內(nèi)存泄露,內(nèi)存泄露的常見來源是緩存,有時候會把對象的引用 放入到緩存當(dāng)中,并且長時間遺忘了它,這時就應(yīng)該考慮緩存中的項(xiàng)是否全都依舊有意義。所以緩存應(yīng)該不時的清除掉已經(jīng)無用的項(xiàng)。清除工作可由后臺一個線程來完成。
3. 監(jiān)聽器和其它回調(diào)也有可能導(dǎo)致內(nèi)存泄露。如果你實(shí)現(xiàn)了一個API, 客戶端在API中注冊回調(diào),卻一直沒有顯示的取消注冊,那么除非你采取某些動作,否則它們就會不斷聚集。確保回調(diào)立即被當(dāng)作垃圾回收的最佳方法是保存它們的弱引用,,例如只將它們 保存為WeakHashMap中的鍵。
?
七、避免使用最終方法
1. 最終方法就是 finalize( ) ,垃圾回收方法。原因是不能保證會及時回收,甚至不能保證會被回收(如果未被捕獲的異常在終結(jié)過程中被拋出來,那么這種異常可能會被忽略)。并且使用終結(jié)方法會有嚴(yán)重的性能損失。因此,不應(yīng)該依賴終結(jié)方法來更新重要的持久狀態(tài)。
2. 應(yīng)該使用顯示的終止方法,通常與 try - finally 結(jié)合使用,以確保及時終止。比如字節(jié)流、字符流、數(shù)據(jù)庫連接等就應(yīng)該使用顯示的 close 方法。 ?
?
總結(jié)
以上是生活随笔為你收集整理的《Effective Java》 第一讲:创建和销毁对象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Delphi关于StringGrid的公
- 下一篇: Android Sqlite 数据初始化