為什麼使用 Getters 和 Setter
考慮一個基本類,其中包含 Java 中帶有 getter 和 setter 的物件:
public class CountHolder {
private int count = 0;
public int getCount() { return count; }
public void setCount(int c) { count = c; }
}
我們無法訪問 count
變數,因為它是私有的。但我們可以訪問 getCount()
和 setCount(int)
方法,因為它們是公開的。對某些人來說,這可能會引發一個問題; 為什麼介紹中間人?為什麼不簡單地讓他們公開?
public class CountHolder {
public int count = 0;
}
出於所有意圖和目的,這兩者在功能方面完全相同。它們之間的區別在於可擴充套件性。考慮每個類所說的內容:
- 首先 :“我有一個方法可以給你一個
int
值,一個方法可以將該值設定為另一個int
”。 - 第二 :“我有一個你可以隨意設定並獲得的節奏。”
這些可能聽起來很相似,但第一個實際上更加謹慎; 它只是讓你與它的內部性質互動,它使然。這將球留在球場上; 它可以選擇內部互動如何發生。第二個是在外部暴露其內部實現,現在不僅容易受外部使用者的影響,而且在 API 的情況下,致力於維護該實現(或以其他方式釋出非向後相容的 API)。
讓我們考慮是否要同步訪問修改和訪問計數。首先,這很簡單:
public class CountHolder {
private int count = 0;
public synchronized int getCount() { return count; }
public synchronized void setCount(int c) { count = c; }
}
但是在第二個例子中,如果不經過並修改引用 count
變數的每個地方,現在幾乎是不可能的。更糟糕的是,如果這是你在庫中提供以供其他人使用的專案,則你沒有辦法執行該修改,並且被迫做出上述的艱難選擇。
所以它引出了一個問題; 公共變數是一件好事(或者至少不是邪惡的)?
我不確定。一方面,你可以看到經得起時間考驗的公共變數示例(IE:System.out
中引用的 out
變數)。另一方面,提供一個公共變數除了極小的開銷和潛在的冗長度之外沒有任何好處。我的指導原則是,如果你計劃公開變數,你應該根據這些標準判斷它有極端的偏見:
- 變數應該沒有可能的原因,以曾經在其實施改變。這是非常容易搞砸的事情(即使你確實做到了,需求也會改變),這就是為什麼 getter / setter 是常見的方法。如果你要使用公共變數,則需要仔細考慮,尤其是在庫/框架/ API 中釋出時。
- 變數需要經常引用,以減少冗長所帶來的最小收益需要它。我甚至不認為使用方法與直接引用的開銷應該在這裡考慮。對於我保守估計為 99.9%的應用程式而言,這幾乎可以忽略不計。
可能還有比我沒有考慮過的更多。如果你有任何疑問,請始終使用 getter / setter。