2017-03-07 40 views
2

我有一個方法,應該只在對象的生命週期中調用一次。爲了確保這種情況,該方法在對象中設置一個布爾型標誌爲true,以便稍後檢查該方法是否已經運行。如果在單個對象的生命週期中第二次調用這個方法,我現在拋出一個IllegalArgumentException(帶有描述性消息),但是這對我來說並不完全正確,因爲問題實際上並不是與參數本身有關。是否有比IllegalArgumentException更好的例外情況?用什麼異常來防止多次調用方法?

在這種情況下,我選擇不使用assert語句,因爲類和方法在包之外都是可見的,所以問題可能是由包之外的代碼引起的。這是正確的想法嗎?

+7

'IllegalStateException'。您的對象處於非法狀態以調用該方法,因爲該標誌被設置爲一個值以指示不應該再次調用該方法。 –

回答

4

拋出一個IllegalStateException

但是由於異常不應該是普通控制流的一部分,所以應該添加一個伴隨方法,該方法返回一個布爾值,該值指示下一次對該方法的調用是否成功。

這種伴侶方法的一個例子是Iterator#hasNext()

設計良好的API不得強制其客戶端使用普通控制流的異常。只有在某些不可預知的條件下才能調用 的「狀態依賴」方法的類應該通常具有單獨的「狀態測試」方法,指示它是否適合調用狀態依賴方法。例如,迭代器接口具有接下來的狀態相關方法,並且相應的狀態測試方法hasNext。

1:從有效的Java,第9章:異常

1

你應該擔心的比特定的異常類型更多的是你在這裏創建了一個糟糕的設計。

良好的界面可以很容易做正確的事情,很難做錯事。

含義:您當前的實現可以很容易地調用該方法兩次;您現在分別強制您的客戶始終檢查該方法是否已被調用。

因此,不要將時間浪費在異常類型上:例如,退一步說明如何將您的一個類解析爲兩個類類。並找到一個很好的,所以調用具體的方法給你一個不同的對象來工作。或者檢查你是否應該使用狀態機來解決這個問題。

+1

我不同意。參看'hasNext'和'next'方法。 – mike

+0

有些情況下,您的建議有意義。但事實並非如此。 – GhostCat