問題:你是如何處理這些用例的?LocalDate:缺少方法isEqualOrBefore isEqualOrAfter
- 你使用靜態輔助方法嗎?
- 你使用verbose equals後跟isAfter/isBefore嗎?
- 你使用否定相反的條件嗎?
- 你使用第三方庫助手嗎?
在日常業務中,我經常需要檢查日期a < =日期b或日期a> =日期b。
互聯網通常建議使用isBefore/isAfter方法的否定版本。
在實踐中我發現,我
- 幾乎從來沒有得到這些否定比較正確的第一次嘗試(他們應該是直觀和容易)。
- 也很難讀碼
我想我的一部分仍然希望,我只是忽略了API中的相應方法(請!)當理解業務邏輯。
/**
* @return true if candidate >= reference </br>
* or in other words: <code>candidate.equals(reference) || candidate.isAfter(reference)</code> </br>
* or in other words: <code>!candidate.isBefore(reference) </br>
* or in other words: <code>candidate.compareTo(reference) >= 0
*/
public static boolean isEqualOrAfter(LocalDate candidate, LocalDate reference)
{
return !candidate.isBefore(reference);
}
/**
* @return true if candidate <= reference </br>
* or in other words: <code>candidate.equals(reference) || candidate.isBefore(reference)</code> </br>
* or in other words: <code>!candidate.isAfter(reference) </br>
* or in other words: <code>candidate.compareTo(reference) <= 0
*/
public static boolean isEqualOrBefore(LocalDate candidate, LocalDate reference)
{
return !candidate.isAfter(reference);
}
編輯:由於由Andreas建議,我加入了版本compareTo
方法,我希望我得到了他們的權利(未經測試)。
編輯2:例:
// Manager says: "Show me everything from 3 days ago or later" or "show me everything that's at most 3 days old"
for(Item item : items) {
// negation idiom
if(!item.getDate().isBefore(LocalDate.now().minusDays(3))) {
// show
}
// compareTo idiom
if(item.getDate().compareTo(LocalDate.now().minusDays(3)) >= 0) {
// show
}
// desired
if(item.getDate().isEqualOrAfter(LocalDate.now().minusDays(3))) {
// show
}
}
你不需要equals方法,前後都足夠了。要使用equals()來測試相等性。 –
@StimpsonCat @StimpsonCat @StimpsonCat在技術上你當然是對的,但這個問題的關鍵在於抱怨它根本不方便(而且對我和其他人來說非常容易出錯) – Zalumon
投票結束爲「主要基於意見的」,因爲對「你如何處理這些用例?」的回答完全是基於觀點的。 ---但是,你忘記列出'compareTo()'。請注意,a.isAfter(b),a.isBefore(b)和a.isEqual(b)與a.compareTo(b)> 0完全相同,a.compareTo( b)<0'和'a.compareTo(b)== 0',所以你的'a.isEqualOrAfter(b)'和'a.isEqualOrBefore(b)'與'a.compareTo(b) )> = 0'和'a.compareTo(b)<= 0'。 – Andreas