2013-02-21 19 views
4

我想知道爲什麼要在java中使用getter和setter方法。如果您可以通過getter和setter讀取或修改私有字段的值,爲什麼不直接將它們更改爲public?我知道獲得者和制定者必須是合理的,但直接的答案是不可能放棄他們呢?java中的訪問器

+0

這是根據OOP。你設置訪問它們的規則。沒有這些規則,任何人都無法訪問它們。 – Arpit 2013-02-21 13:31:47

回答

6

一些原因是:

  • 您可以添加額外的約束和檢查。例如,如果特定的整數屬性必須在[10..20]的範圍內,則可以輕鬆地將檢查添加到setter以確保該屬性上未設置其他值。
  • 只能通過提供getter來使其成爲「只讀」。
  • 您可以在setter上輕鬆設置源斷點,以查看該值何時以及從何處被修改。
  • 您可以輕鬆地添加日誌記錄以跟蹤哪些值已設置。

查看答案由@Aditi爲其他原因所提供的鏈接:Why use getters and setters?

+0

3.您可以添加日誌記錄以確定何時設置值。 – GSP 2013-02-21 13:33:10

+0

@GSP非常有效的點,添加到列表中 – 2013-02-21 13:34:49

2

一個錯誤追查中最難的形式是在一個數據項的值的意外,不適當的變化。

如果數據是公開的,則更改的代碼可能在程序中的任何位置。

如果它是私有的,那麼進行更改的代碼必須位於同一個源文件中,通常是同一個類。很容易找到並測試所有可能改變它的代碼,包括它的setter。

1

將字段私有化以保留Java類中的封裝是一種很好的做法。應用程序中的任何內容都不應該知道類的「內部」,這是實現細節。他們唯一需要訪問的是對象上的方法,以請求值或執行進程。

在某些情況下,您可能想要將某些內部值賦予另一個類。在這種情況下,建議通過吸氣劑來完成,而不是直接完成。這樣,當您需要更改該類的合同和/或其實現細節(如何在內部存儲值)時,重構將變得更容易。

此外,由於這是使用getters/setters的常見模式,因此這會使您的代碼更易於被外部讀者或同事讀取,並且某些第三方庫期望它們在那裏。

0

通過使用getters和setter來代替直接訪問成員變量,我們可以做數據驗證。

例如,

public void setAge(){ 
    if(age < 0){ 
    //throw exception 
    } 
} 
2

這是將接口與實現(1)分開併爲變更做準備(2)的方式。也許簡單的例子可以幫助。

(1)
假設您有一個用戶將firstName和secondName存儲在單獨的字段中。現在,您可以使用getFullName方法連接fisrtName和secondName,但使用User類的程序員不必知道firstName和secondName是兩個單獨的字段。


(2)
現在,您想要在一個字段中存儲用戶類fullName,所以您只需在User類中進行更改,而不必調用getFullName方法的所有調用,您如果您直接使用字段,則必須採取措施。