2014-01-20 63 views
0

Get/Set方法用于保护我的类字段。在java中获取/设置和参考

但由于Java的工作,参照我的私人领域仍然得到暴露..

例如

private Date d; 

Date getDate(){ 
    return d; 
} 

void setDate(Date inD){ 
//Checks for inD 
d = inD; 
} 


//Still the issue is 

getDate().setHours(xyz); 

什么是正确的方法?因为我不想更改我的日期而不使用setDate。

回答

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是一种更清洁的日期/时间库它有足够稳定的类型的。

现在,这只是一个例子 - 在其他情况下,您可能想要在可变对象上返回不可变的视图(为避免必须复制大量数据在每个get打电话。

+0

你能否解释一下“不可改变的看法”?如果可能的话,我认为要返回一个const引用。像public public Date getDate() – sethi

+0

return new Date(d.getTime()); - 请解释这一点,我不明白,一个get方法如何帮助不改变原始值? – gowtham

+0

@sethi:不,在Java中没有像“const引用”这样的概念。在方法声明中使用'final'意味着该方法不能被覆盖。对于“不可变视图”,我指的是将只读访问委托给另一个对象的对象,但不允许任何突变。 –

0

日期只是可憎的,因为它是可变的。你可以做些什么来安全起见,是返回一份日期的副本。如果修改了,原始值不会更改。

1

有针对被称为防守复制一个好办法,

Date getDate(){ 
    return new Date(d.getTime()); 
} 

你会得到它的拷贝和原始的人会不会产生任何影响