第76條 努力使失敗保持原子性
通常來講蜈块,調(diào)用方法失敗了撕予,應(yīng)該使對(duì)象保持在被調(diào)用之前的狀態(tài)
-
實(shí)現(xiàn)失敗原子性的方法:
設(shè)計(jì)一個(gè)不可變的對(duì)象脖镀。如果對(duì)象是不可變的潘懊,失敗原子性就是顯然的易核。如果一個(gè)操作失敗了匈织,它可能會(huì)阻止創(chuàng)建新的對(duì)象,但是永遠(yuǎn)也不會(huì)使已有的對(duì)象保持在不一致的狀態(tài)之中
-
在執(zhí)行操作之前檢查參數(shù)的有效性
public Object pop() { if (size == 0) throw new EmptyStackException(); Object result = elements[--size]; elements[size] = null; // Eliminate obsolete reference return result; }
對(duì)對(duì)象的臨時(shí)副本執(zhí)行操作牡直,并在操作完成后用臨時(shí)副本替換對(duì)象的內(nèi)容
編寫一段恢復(fù)代碼(recovery code)缀匕,由它來攔截操作過程中發(fā)生的失敗,以及使對(duì)象回滾到操作開始之前的狀態(tài)碰逸。這種辦法主要用于永久性的(基于磁盤的(disk-based))數(shù)據(jù)結(jié)構(gòu)
思考
- 我們的代碼中有很多是不規(guī)范的乡小,他們會(huì)在一個(gè)transaction中構(gòu)造出來Domain對(duì)象,然后直接通過判斷Domain對(duì)象的狀態(tài)查看參數(shù)是否合理饵史,不合理的話直接rollback transaction满钟。這種做法是依賴了事務(wù)的原子性,我個(gè)人是不喜歡這種做法的胳喷。個(gè)人傾向于使用vo這種對(duì)象提前進(jìn)行判斷湃番,通過了判斷再創(chuàng)建Domain對(duì)象