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