在java和引用中获取/设置

时间:2014-01-20 08:43:41

标签: java

获取/设置方法可以保护我的班级字段。

但是由于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的情况下更改我的日期。

3 个答案:

答案 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)

日期只是令人厌恶,因为它是可变的。您可以做些什么来确保安全,就是返回日期的副本。如果修改了,则原始值不会更改。