2012-06-03 74 views
21

我知道這可能是一個明顯的問題,但我在看這段代碼:爲什麼要用-1作爲參數實例化Date?

private Date lastActivity = new Date(-1); 

而且很好奇這是什麼一樣 - 在Date class有六個不同的構造,並且只有一個可以採取的long一個參數,像這樣:

public Date(long date) 

其中:

分配Date對象並對其進行初始化,以表示指定 自標準基準時間(即「 時代」,即1970年1月1日,格林威治標準時間00:00:00)開始的毫秒數。

那麼-1是一個佔位符嗎?我很欣賞任何提示或建議。

回答

5

所以是-1只是一個佔位符?我很欣賞任何提示或建議。

可能不是術語佔位符通常使用的意義。 (這是代表......或者擁有某地的東西......)

它更可能是一個代表計算目的的邊界條件的值。在這種特殊情況下,變量名稱lastActivity似乎暗示了這一點。我會想象這是一些算法的一部分,以確定「一項活動」的最新時間......並且該對象將被視爲「未曾發生的活動」的含義。他們也可以使用null或一個標誌來表示這個...但使用「時髦的」Date對象可能會略微簡化算法的邏輯。

「哨兵價值」是一個很好的術語...但「標記價值」不是很好,因爲它實際上沒有標記任何東西。

(從某種意義上說,-1的選擇是任意的,它可以是任何值......只要它不對應於算法可能遇到的時間點,使用-1是理想的,點總是會在UNIX紀元之後... 1970年1月1日。但是如果它可能需要處理歷史日期,那麼Long.MIN_VALUE可能會更好。無論哪種方式......這在所有這些都可能是毫無意義的)

17

通常會這樣做以獲得一個「衆所周知的」日期,可能用於驗證或比較(所有「真實日期」都大於此值),作爲指示日期真是未知的「標記對象」 /非法/掛起,但你不想因爲某種原因使用null,或者可能爲了單元測試。

O.K.,爲我所謂的「標記值」查找更合適的術語,我得到了標記值,標記值,行程值,流氓值,信號值或虛擬數據。看到wikipedia article here

+0

你甚至可以這樣做嗎?如果您試圖將其設置爲無效值,我認爲Date對象會拋出異常。我想是的。 –

+0

我從來沒有嘗試過-1,但爲此目的經常使用新的Date(0) – user949300

+2

@Adel是的,這是一個虛假的日期,但一個「衆所周知的」假日期。 :-)在許多例子中,你使用-1來計數或索引來表示「未找到」。 (例如String.indexOf())。在那個例子中,-1是一個衆所周知的僞造位置。 – user949300

19

January 1, 1970, 00:00:00 GMT減一毫秒(負數是劃時代的開始日期後面)

+0

非常感謝您的操作! – Coffee

+0

是的,但是您認爲最後的活動實際上是否可能發生?不,這幾乎肯定是一個標記對象。 – user949300

4

這就是所謂的sentinel value。重點通常是指出數據不可用,一系列數據已結束等。通過使用明確無效的特定值,可以節省維護單獨的isValidisFinished字段的工作量。

對於這是否是好的做法,意見不同。當約定非常有名時,如在終止C字符串的ASCII \0中,它通常被接受。在其他情況下,您往往有可能擴大未來被認爲「有效」的範圍,然後在處理遺留數據時會遇到困難。它也違反了單一責任原則:這部分數據可能代表兩個截然不同的信息,這會損害可維護性,因爲代碼閱讀器可能不知道隱藏的潛在特殊含義,而類型系統無法幫助您發現它。

+0

+1用於討論此代碼的問題 – sleske

相關問題