用set get與直接設為public有什么區別
這事我剛學的時候也挺疑惑的。問老師就是說封裝性,不要交給外人控制,比如年齡你就要在set里面設置判斷條件,不能隨便賦值。這么說確實有道理,但至於每個變量都set get一下嗎,雖然說編譯器好用,但有些時候,我好像直接設置成public也沒什么關系。
這個疑惑其實在我心里一直沒解開,只是老師這樣教,編譯器也提供了便捷方法就一直迷迷糊糊的用了,反正大家都這樣寫。直到剛剛一段不安全的代碼才讓我重新思考起了這個問題。
為什么用set get
個人認為是先有set,比如說我們有一個age變量,但我們並不希望它被任意賦值。所以我們需要將其設置為private,提供一個set方法防止別人給他賦個1000歲,這不成怪物了嗎?有了set之后,你將變量弄成了private別人無法直接訪問了,所以又弄了個get。也就是說如果你對變量的賦值有約束的話就應該使用set get,它們就是為了封裝而生的。
用了就萬事大吉?
用了set get你就真的封裝好了?請看代碼
public class T {
private List<String> results=new LinkedList<>();
public List<String> getResults() {
return results;
}
public void setResults(List<String> results) {
this.results = results;
}
}
各位覺得有什么問題嗎?好像沒啥問題,都是這樣的,順手一按編譯器就自動生成了。但其實如果你返回的是集合的話,那么這樣子形同虛設。
T t=new T();
t.getResults().add("!!!");
t.getResults().clear();
外部修改數據還是這么的隨意,如果我們只想讓外界讀取results,把修改的控制權放在自己手上該如何是好呢?
當然是返回一個不可修改的集合啦:
public List<String> getResults() {
return Collections.unmodifiableList(results);
}
這樣我們就將其封裝好了。所以不要直接無腦用編譯器生成set get,如同上面的例子。你不對get進行調整,就如同一個public,完全沒有封裝起來。應該結合具體需要,編寫set get,這樣才符合初衷。