2011-10-28 76 views
11

這是對問題1 & 2的更多後續。Findbugs與Java中的Date對象的可變性問題

如題告訴了下面的代碼

public Date getSomeDate() { 
    return someDate; 
} 

會給你findbug錯誤issue

建議的解決辦法是複製在兩個getter和setter Date對象像

public Date getSomeDate() { 
    return new Date(someDate.getTime()); 
} 

這是一個很好的方法還是有什麼其他辦法嗎?

java中有沒有可以解決這個問題的Immutable Date庫?

+0

你的意思是一成不變的吧?無論如何,所述的方法是完美的。 –

+0

@PrinceJohnWesley:謝謝,是的。我已經更新了Qs。你的意思是說可以在所有的getter和setter中使用Date構造函數嗎? – ManuPK

+0

只要您不將呼叫暴露給外部庫。你不需要深入克隆(構造函數)它,因爲你知道你在做什麼。否則,如果它是可變的,則總是給出差異參考。嘗試joda time api –

回答

6

JodaTime有不可改變的日期。

當然,在吸氣劑中使用Date的構造函數沒關係,爲什麼它不是?

這就是說,僅僅因爲FindBugs將可變狀態作爲一個潛在的錯誤,它並不意味着它本質上值得關注–它取決於如何使用類。不變性消除了一種類型的錯誤,您可能需要或可能不需要關心很多。

0

根據您的使用情況,您可以返回someDate.getTime(),而不將其包裝在Date中。

0

等一下......通過複製getSomeDatesetSomeDate方法,我們不消除了安全風險中的對象,因爲變化的目標回來通過setSomeDate和副本保存更改後的值。爲了解決這種安全問題,您需要刪除setSomeDate,否則不必擔心。

+2

通過返回對象的副本,我們避免了內部表示被共享 - 這將有助於避免調用代碼(即使它接收到此屬性到本地變量)操縱此操作的情況,bean屬性將會改變。爲了說明這一點,setsomeDate不能被刪除,因爲這是bean的基本行爲。 – emeralddove

7

關注夥計......

除了適應兩個getter和你需要採取有關空值護理二傳手:

public Date getSomeDate() { 
    if (this.someDate == null) { 
    return null; 
    } 
    return new Date(this.someDate.getTime()); 
} 

public void setSomeDate(final Date someDate) { 
    if (someDate == null) { 
    this.someDate = null; 
    } else{ 
    this.someDate = new Date(someDate.getTime()); 
    } 
}