大多數(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)證俺祠。