2016-06-09 44 views
1

聲納說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?

+2

你選擇哪一個並不重要。我會寫:'return originalDate!= null? new Date(originalDate.getTime()):null;' – Jesper

+1

如果你想使它不可變,你可以將'date.getTime()'作爲'final long'存儲。然後,當你需要它時,將它重新水化到一個「新的Date(fieldName)」。如果你想稍微強一點的話,用'toDate()'''fromDate()'方法爲long創建一個簡單的包裝類。 –

+0

如果我是你,我不會惹惱'java.util.Date'。如果您有機會使用JDK 8,我會建議您使用Instant,否則您可以簡單地存儲紀元毫秒或Joda Time。 – ppopoff

回答

2

我應該用構造函數(例子A)還是用克隆(例子B)複製我的originalDate?

選擇更具可讀性的方式。即實例A.

但是Ternary Operator已經在這裏使用。

你可能想看看這裏:Clone() vs Copy constructor- which is recommended in java

+0

即使經常假定Date只是一個長整型值的包裝,實際上並不是這樣。 'new Date(oldDate.getTime())'不僅僅是一個簡單的「複製構造函數調用」,'getTime()'可能需要一些計算來返回一個結果,並且新對象在技術上不一定等同於(儘管語義上)舊的Date對象。 – jarnbjo