用set get與直接設為public有什么區別


用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,這樣才符合初衷。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM