2014-01-20 114 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()); 
} 

你會得到它的拷貝和原始的人會不會產生任何影響