2017-04-15 58 views
0

我有Month類,其中包含一些數據,例如。 number,number of days等。我想簡單地創建這個類實例。我決定創建包含月份數據並返回就緒對象的簡單工廠。我的問題是在哪裏檢查數據的正確性,例如。 1月有31天和其他幾個人...應Month班檢查數據是否正確或Factory應該對它負責嗎? (在這種情況下,我們可以創建具有無效數據的Month對象)...簡單的工廠 - 檢查數據的正確性

回答

0

Your Month class should check this this itself。擁有僅僅依賴類中的類的邏輯總是最佳實踐。否則,如果其他人使用你的應用程序並在不使用工廠的情況下實例化一個Month對象,它將會起作用,但它不會成爲設計者所期望的。

無論你喜歡它,你都可以處理一個錯誤,但是我會在構造函數中執行它,然後在有人試圖用無效參數實例化時拋出一個錯誤。

0

您應該在將參數傳遞給構造函數之前對其進行驗證。

但是,如果輸入是動態的而不是由您完成的,靜態工廠方法可能不是驗證輸入的最佳位置。

如果你只是想確保,編譯器會發出警告,如果你使用無效的參數,你可以拋出checked異常這樣的:

public static final Month newMonth(int numberOfDays) { 
if(numberOfDays > 31 || numberOfDays < 28) { 
throw new IllegalArgumentException("invalid numberOfDays"); 
} 
return new Month(numberOfDays); 
} 

無論哪種方式,在我看來,你不應該去試試... catch方法或讓構造函數驗證任何東西,因爲它會讓你的代碼更不易讀,而且如果你改變你的驗證方法,也可能會破壞很多其他的代碼。

1

請不要重新創建日曆類!有人已經爲你做了。看看Joda-Time或Java 8包java.time。這是學習如何設計類似Month的好起點。

這一天的月份不應該混合在一個類中。因爲一個月有多少天取決於年份和日曆系統。當你從天月的,個月創建日期無效天數的驗證應該做的。因此它是日期對象的構建過程的一部分。

這看起來很奇怪:

Month january = Month.newMonth(31); 

這產生從int一個Month對象應該檢查該參數是在從1(1月)到12(12月)範圍,並返回表示一個枚舉工廠方法具體的月份。

這正是我所期望的:

Month january = Month.newMonth(1);