2010-01-29 52 views
15

如果一個類有一個構造函數,它將一些值對象作爲參數,並依靠它來進行初始化。如果此對象爲空,它應該如何反應?給定無效參數時,構造函數應該如何處理?

class SomeClass 
{ 
    private SomeData _data; 
    public SomeClass(SomeValueObject obj) 
    { 
     _data = obj.Data; 
    } 
} 

這是一個例子,但一般:應該如何構造的行爲如果給定參數無效,因此不能做好這方面的建設?它應該只是返回而不進行任何初始化?將參數設置爲某些默認值?拋出異常?還有別的嗎?

我敢肯定,這個問題的答案是「這取決於」,但是否有任何的最佳做法等?

回答

15

程序員應該能夠假定一個對象被成功創建,除非引發異常。異常的類型取決於參數,但應該不加選擇。你想要的最後一件事是構造函數無法構建一個有效的對象,也不會告訴調用者。

我認爲在構造函數中使用默認值是一個危險的習慣。

+0

我肯定會採用這種例外的方法。這是最簡單的方法。 – hurikhan77 2010-01-29 22:28:31

+2

我支持這個。讓對象處於某種未定義的狀態確實沒有多大價值。 – stiank81 2010-01-30 06:49:35

2

拋出一個空參數異常。

+0

如果不爲空,那麼該怎麼辦? – NVRAM 2010-01-29 23:56:51

+0

Quote'如果一個類有一個構造函數,它將一些值對象作爲參數,並依靠這個來做它的初始化。如果此對象爲空,它應該如何反應? ' – David 2010-01-30 00:08:11

+1

如果它不爲空,只是無效?然後拋出invalidargument異常,而不是火箭科學 – David 2010-01-30 00:10:30

3

看起來這是Java,但在C++中應該明確地拋出(一std::invalid_argument偶)。

請參閱C++ FAQ Lite 17.2

我想這對Java來說是完全一樣的。

在極少的情況下拋出異常呈現了太大的開銷,你應該返回,並在對象中設置一個標誌,它不能正常施工。之後檢查isValid()成員函數。

+0

其實它是C#,但我認爲這應該是所有3種語言相同 - 以及更多。 – stiank81 2010-01-30 06:50:47

6

很大程度上取決於您的業務邏輯。如果你的業務邏輯要求SomeValueObject是不爲空,這意味着SomeClass不能沒有SomeValueObject被實例化,然後構造絕對應該拋出一個異常,可能IllegalArgumentException

+0

太多apprechiated !!! – 2015-05-09 12:46:24

1

如果字段非常重要,它應該投射一個異常來指示該對象不應該被使用。如果不重要,您可以指定默認值。

1

如果一個對象可以有無效的默認值,那麼它應該初始化爲默認值,並等待初始化。例如,foo.set_values(...)。在這種情況下,應該詢問is_ready()is_valid()以允許在使用前進行檢查。

如果對象是絕對不能是一個無效數據的狀態,那麼它應該拋出異常。

這兩種情況都是我已經列入的東西。

相關問題