用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,這樣才符合初衷,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/147638.html
標籤:Java
