為什么要用Getter和Setter方法,而不是公開(kāi)屬性

封面

大多數(shù)字段的訪問(wèn)都是通過(guò)Getter和Setter方法來(lái)間接訪問(wèn),為什么不直接將字段設(shè)置為公開(kāi)屬性Public呢?答案在于前者的未來(lái)可能性。當(dāng)我在Java語(yǔ)言編程中開(kāi)始我的職業(yè)生涯時(shí),我就對(duì)Getter和Setter感到困惑。為什么要這么寫(xiě)呢?為什么不直接用Public呢?這對(duì)我來(lái)說(shuō)是個(gè)奇怪的語(yǔ)法。

我了解到,通過(guò)公共訪問(wèn)修飾符,類(lèi)的一個(gè)字段對(duì)于任何包都是可訪問(wèn)的,并且使用getter/setter,我實(shí)際上正在做相同的事情——使字段私有化,而getter/setter方法是公共的,因此它可以被任何包訪問(wèn)。那么,下面屬性name和value的區(qū)別是什么呢?

代碼示例

慢慢地,我意識(shí)到了為什么我們使用Getter和Setter,以及為什么它們是重要的。使用Public屬性與通過(guò)Getter和Setter公開(kāi)它的主要區(qū)別在于保持對(duì)該屬性的控制。如果你把一個(gè)字段公開(kāi),就意味著你可以直接訪問(wèn)調(diào)用方。然后,調(diào)用者可以做任何事情與你的領(lǐng)域,無(wú)論是有意或無(wú)意。例如,可以將字段設(shè)置為空值,如果在另一個(gè)方法中使用該字段,則該方法可能會(huì)因空指針異常而崩潰。

但是,如果你提供了一個(gè)Getter和Setter,你可以在完全控制的同時(shí)提供間接訪問(wèn)。設(shè)置值的惟一方法是通過(guò)Setter,通過(guò)Getter獲得值,所以現(xiàn)在字段只有一個(gè)入口和一個(gè)出口點(diǎn),因?yàn)镚etter和Setter是允許代碼塊的方法,所以可以對(duì)它們進(jìn)行驗(yàn)證檢查!對(duì)象決定是否設(shè)置調(diào)用者值。這同樣適用于Getter方法——您可以決定返回實(shí)際的引用或克隆它,并將其返回給調(diào)用者。

因此,Getter和Setter起到保險(xiǎn)絲或斷路器的作用,電流必須通過(guò)保險(xiǎn)絲。如果發(fā)生故障,熔斷器與主電路分離,電路是安全的。這里的概念是相同的。如果出現(xiàn)任何錯(cuò)誤,Setter將不會(huì)將該值傳遞給類(lèi)成員字段。讀了解釋之后,我知道你還有一個(gè)問(wèn)題。

我理解,但一般來(lái)說(shuō),我們不寫(xiě)任何東西在Getter和Setter。我們只返回并設(shè)置字段,就像公開(kāi)字段一樣。那你為什么要說(shuō)這些?為了回答這個(gè)問(wèn)題,我說(shuō)通過(guò)編寫(xiě)Getter和Setter,我們創(chuàng)建了一個(gè)用于將來(lái)添加任何驗(yàn)證方法的條款,目前,沒(méi)有驗(yàn)證,但是如果將來(lái)出現(xiàn)任何錯(cuò)誤,我們只是在Setter中添加驗(yàn)證邏輯。但是,當(dāng)一個(gè)字段沒(méi)有這樣的驗(yàn)證約束時(shí),為什么要麻煩寫(xiě)一個(gè)Getter和Setter?我可以簡(jiǎn)單地公開(kāi)它。

根據(jù)我的理解,問(wèn)題的癥結(jié)在于避免使代碼變得不必要的復(fù)雜。這就像當(dāng)有人試圖使他們的代碼基礎(chǔ)更加通用,適應(yīng)于任何變化。雖然他/她所想到的大部分變化永遠(yuǎn)不會(huì)到來(lái)。因此,Getter和Setter不會(huì)使代碼復(fù)雜,這將在你的代碼中得到驗(yàn)證。

歡迎關(guān)注我的公眾號(hào) “java工會(huì)”,一起交流技術(shù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類(lèi)型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,666評(píng)論 1 32
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 30,246評(píng)論 8 265
  • 1. load 與 initialize load:是當(dāng)類(lèi)或分類(lèi)被添加到 Objective-C runtime ...
    杰克道長(zhǎng)閱讀 1,470評(píng)論 0 3
  • 1.1 spring IoC容器和beans的簡(jiǎn)介 Spring 框架的最核心基礎(chǔ)的功能是IoC(控制反轉(zhuǎn))容器,...
    simoscode閱讀 6,851評(píng)論 2 22
  • 平平淡淡才是真,話雖有理,要分時(shí)間,別二十幾歲就如同上完了一生的課,讀完了一輩子的書(shū),看完了一世的風(fēng)景,飽含著對(duì)生...
    MacawZ閱讀 865評(píng)論 0 1

友情鏈接更多精彩內(nèi)容