聲納說mutable members should not be stored or returned directly幫助方法克隆日期?
可變對象是那些狀態是可以改變的。例如,一個數組是可變的,但是一個String不是。永遠不會將可變類成員返回給調用者或直接接受和存儲。這樣做會使您容易受到班級狀態的意外變化的影響。
取而代之,應該製作可變對象的副本,並且該副本 應該被存儲或返回。
該規則檢查數組,收集和日期沒有存儲或直接返回 。
我試圖存儲一個日期。爲了解決聲納警報,我創建了兩個輔助方法來返回我的原始日期的副本。
實例A:
public static Date clone(Date originalDate) {
if(date != null) {
return new Date(originalDate.getTime());
}
return null;
}
例B:
public static Date clone(Date originalDate) {
if (date != null) {
return (Date)originalDate.clone();
}
return null;
}
如果我使用的構造方式(例如A),我失去它包含我的原始日期可能的額外信息。
我應該用構造函數(例子A)還是用克隆(例子B)複製我的originalDate?
你選擇哪一個並不重要。我會寫:'return originalDate!= null? new Date(originalDate.getTime()):null;' – Jesper
如果你想使它不可變,你可以將'date.getTime()'作爲'final long'存儲。然後,當你需要它時,將它重新水化到一個「新的Date(fieldName)」。如果你想稍微強一點的話,用'toDate()'''fromDate()'方法爲long創建一個簡單的包裝類。 –
如果我是你,我不會惹惱'java.util.Date'。如果您有機會使用JDK 8,我會建議您使用Instant,否則您可以簡單地存儲紀元毫秒或Joda Time。 – ppopoff