我們不應該使用Date
的clone()
方法制作防禦式拷貝的副本,因爲這樣得到的Date
是nonfinal
的,clone()
方法並不保證返回一個類爲java.util.Date
的object
:它可能返回不受信任的,甚至可被用於惡意用途的子類實例。這樣不受信任的子類可能會在創建實例時在私有靜態列表中記錄對每個實例的引用,並允許攻擊者訪問此列表。
——Effective Java (7th Edition)
我們可以考慮用確定的SimpleDateFormat
將Date
轉化爲String
,再利用得到的String
new
一個記錄了相同時間的Date
。
例如
public Date getDate() {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
try {
return df.parse(df.format(date));
} catch (ParseException e) {
e.printStackTrace();
}
}
其中date
是需要Date的一個實例,我們在這個函數裏需要返回它的一個防禦性拷貝。df.format(date)
是將Date date
依照DateForlmat df
轉化爲一個String
,而df.parse(String)
則是將一個String
按照DateForlmat df
轉化爲一個Date
。通過df.parse(df.format(date))
這樣的操作,我們成功得到了一個Date date
的防禦性拷貝。