获取/设置方法可以保护我的班级字段。
但是由于Java正在使用引用,我的私有字段仍然暴露出来..
e.g。
private Date d;
Date getDate(){
return d;
}
void setDate(Date inD){
//Checks for inD
d = inD;
}
//Still the issue is
getDate().setHours(xyz);
什么是正确的方法?因为我不想在不使用setDate的情况下更改我的日期。
答案 0 :(得分:5)
因为我不想在不使用setDate的情况下更改我的日期。
然后,您不应该在get
方法中返回对可变对象的引用。例如:
private Date d;
Date getDate() {
// Return a reference to an independent copy of the original data
return new Date(d.getTime());
}
void setDate(Date inD) {
// Checks for inD
d = inD;
}
更好的方法(IMO)是为您的字段使用不可变类型 - Joda Time API是一个更清晰的日期/时间库和它有很多不可变类型。< / p>
现在这只是一个例子 - 在其他情况下你可能想要在可变对象上返回一个不可变的视图(你通常会避免自己改变)以避免复制每个get
电话都有很多数据。
答案 1 :(得分:1)
有一种很好的方法,称为防御性复制,
Date getDate(){
return new Date(d.getTime());
}
你会得到它的副本而原始的没有影响
答案 2 :(得分:0)
日期只是令人厌恶,因为它是可变的。您可以做些什么来确保安全,就是返回日期的副本。如果修改了,则原始值不会更改。