2011-11-10 51 views
5

在我們的項目,我們需要存儲一些對象(用戶等)以及用戶類必須有一個有效標誌(如setOutdated和isOutdated方法)我更喜歡哪種模式?

不時,我們的用戶對象可能是空的,但在這種情況下驗證標誌必須可達。可以從User類中提取這些方法,但由於語義,該字段和方法必須位於該類內部。我發現了一些關於空對象模式的文章(如this),我想知道 - 是否可以創建空對象(作爲模式),它可以存儲多個狀態,如null過期,null不過時,不爲null過時,不爲null不過時。

PS:如果在我班上一個推出「過時」的領域,這將是,而不是設置爲null

+0

你有什麼不想檢查,如果它是一個空之前,你居然叫'isOutdated()'或類似的「狀態跳棋」什麼特別的原因? – DejanLekic

+0

即使用戶是空的,我必須能夠訪問過時的領域,所以我必須存儲的地方,信息 – skayred

+0

在這種情況下,我只想補充的狀態,說這是默認設置爲false「隨時可用」,並使用對象只有在readyToUse爲true時纔是「不爲空」。 – DejanLekic

回答

2

您想區分(其中包括)「null outdated」和「null not outdated」。
這意味着你建議兩個不同的空對象,具有不同的行爲。這違反了這樣的模式:一個Null對象應該有一種行爲,這是一種未初始化對象的默認行爲。

我建議你要麼使用所提供的解決方案@Kent,或者你讓你的用戶對象像「PresentUser」和「FormerUser」對象。後者在技術上與您自己提出的解決方案相同,但它不是空對象模式。

2

我的第一個想法是添加UserUtil類真的很難明確對象(名稱可能是別的東西) 。

和像

public static boolean isUserOutdated(User u){ 
return (u==null)? true :u.isOutdated(); 

} 

or return (u==null)? false :u.isOutdated(); depends on your businesslogic 

的方法它在你的情況下工作?

+0

我怕,因爲它似乎是一個不好的做法,在OOP – skayred

+0

我覺得一個實用程序類的靜態方法即可使用靜態方法。如果你真的很討厭一成不變的,你當然可以刪除「靜態」,並創建一個適當的構造函數。問題是,如果我的答案中的解決方案適用於您的情況? – Kent

相關問題