為什么要用Getter和Setter方法,而不是公開屬性

封面

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

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

代碼示例

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

但是,如果你提供了一個(gè)Getter和Setter丈积,你可以在完全控制的同時(shí)提供間接訪問筐骇。設(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ì)將該值傳遞給類成員字段元扔。讀了解釋之后躯保,我知道你還有一個(gè)問題。

我理解澎语,但一般來(lái)說(shuō)途事,我們不寫任何東西在Getter和Setter。我們只返回并設(shè)置字段擅羞,就像公開字段一樣尸变。那你為什么要說(shuō)這些?為了回答這個(gè)問題减俏,我說(shuō)通過(guò)編寫Getter和Setter召烂,我們創(chuàng)建了一個(gè)用于將來(lái)添加任何驗(yàn)證方法的條款,目前垄懂,沒有驗(yàn)證骑晶,但是如果將來(lái)出現(xiàn)任何錯(cuò)誤,我們只是在Setter中添加驗(yàn)證邏輯草慧。但是桶蛔,當(dāng)一個(gè)字段沒有這樣的驗(yàn)證約束時(shí),為什么要麻煩寫一個(gè)Getter和Setter漫谷?我可以簡(jiǎn)單地公開它仔雷。

根據(jù)我的理解,問題的癥結(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)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蜘渣,隨后出現(xiàn)的幾起案子淌铐,更是在濱河造成了極大的恐慌,老刑警劉巖蔫缸,帶你破解...
    沈念sama閱讀 212,294評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腿准,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡拾碌,警方通過(guò)查閱死者的電腦和手機(jī)吐葱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)倦沧,“玉大人唇撬,你說(shuō)我怎么就攤上這事≌谷冢” “怎么了窖认?”我有些...
    開封第一講書人閱讀 157,790評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)告希。 經(jīng)常有香客問我扑浸,道長(zhǎng),這世上最難降的妖魔是什么燕偶? 我笑而不...
    開封第一講書人閱讀 56,595評(píng)論 1 284
  • 正文 為了忘掉前任喝噪,我火速辦了婚禮,結(jié)果婚禮上指么,老公的妹妹穿的比我還像新娘酝惧。我一直安慰自己榴鼎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,718評(píng)論 6 386
  • 文/花漫 我一把揭開白布晚唇。 她就那樣靜靜地躺著巫财,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哩陕。 梳的紋絲不亂的頭發(fā)上平项,一...
    開封第一講書人閱讀 49,906評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音悍及,去河邊找鬼闽瓢。 笑死,一個(gè)胖子當(dāng)著我的面吹牛心赶,可吹牛的內(nèi)容都是我干的扣讼。 我是一名探鬼主播,決...
    沈念sama閱讀 39,053評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼缨叫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼届谈!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起弯汰,我...
    開封第一講書人閱讀 37,797評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤艰山,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后咏闪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體曙搬,經(jīng)...
    沈念sama閱讀 44,250評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,570評(píng)論 2 327
  • 正文 我和宋清朗相戀三年鸽嫂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纵装。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,711評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡据某,死狀恐怖橡娄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情癣籽,我是刑警寧澤挽唉,帶...
    沈念sama閱讀 34,388評(píng)論 4 332
  • 正文 年R本政府宣布,位于F島的核電站筷狼,受9級(jí)特大地震影響瓶籽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜埂材,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,018評(píng)論 3 316
  • 文/蒙蒙 一塑顺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧俏险,春花似錦严拒、人聲如沸扬绪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)勒奇。三九已至,卻和暖如春巧骚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背格二。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工劈彪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人顶猜。 一個(gè)月前我還...
    沈念sama閱讀 46,461評(píng)論 2 360
  • 正文 我出身青樓沧奴,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親长窄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子滔吠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,595評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

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