我们不应该使用Date
的clone()
方法制作防御式拷贝的副本,因为这样得到的Date
是nonfinal
的,clone()
方法并不保证返回一个类为java.util.Date
的object
:它可能返回不受信任的,甚至可被用于恶意用途的子类实例。这样不受信任的子类可能会在创建实例时在私有静态列表中记录对每个实例的引用,并允许攻击者访问此列表。
——Effective Java (7th Edition)
我们可以考虑将Date
转化为毫秒数再利用毫秒数新建一个的办法;
也可以考虑用确定的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
的防御性拷贝。