无码av一区二区三区无码,在线观看老湿视频福利,日韩经典三级片,成 人色 网 站 欧美大片在线观看

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊

java 核心技術(shù)-12版 卷Ⅰ- 4.3.8 封裝的優(yōu)點(diǎn)

2023-03-20 23:00 作者:CC挑燈夜讀_谷  | 我要投稿

原文:????

????最后再仔細(xì)看一下非常簡單的 getName 方法、getSalary方法和getHireDay方法。

這些都是典型的訪問器方法。由于它們只返回字段的值,因此又被成為字段訪問器(field accessor)。

????如果將name 、salary 和 hireDay字段標(biāo)記為公共,而不是編寫單獨(dú)的訪問器方法,不是更容易一些嗎?

????不過,name 是一個(gè)只讀字段,一旦在構(gòu)造器中設(shè)置,就沒有辦法能夠修改這個(gè)字段。這樣我們可以確保name字段不會(huì)受到外界的破壞。

????雖然salary 不是只讀字段,但是它只能用raiseSalary方法修改。具體地,如果這個(gè)值出現(xiàn)了錯(cuò)誤,那么只需要調(diào)試這個(gè)raiseSalary方法就可以了。如果salary字段是公共的,破壞這個(gè)字段值的罪魁禍?zhǔn)子锌赡艹鰶]在任何地方(那就很難調(diào)試了)。

????有些時(shí)候,可能想要獲得或設(shè)置實(shí)例字段的值,那么你需要提供下面三項(xiàng)內(nèi)容:

  • 一個(gè)私有的實(shí)例字段;

  • 一個(gè)公共的字段訪問器方法;

  • 一個(gè)公共的字段更改器方法。

????這樣做要比提供一個(gè)簡單的公共實(shí)例字段復(fù)雜些,但有很多明顯的好處。

????首先,可以改變內(nèi)部實(shí)現(xiàn),而不影響該類方法之外的任何其他代碼。例如,如果將存儲(chǔ)姓名的字段改為:

????那么getName方法可以改為返回

????這個(gè)修改對于程序的其余部分是完全不可見的。

????當(dāng)然,為了進(jìn)行新舊數(shù)據(jù)表示之間的轉(zhuǎn)換,訪問器方法和更改器方法可能需要做許多工作。這將為為我們帶來第二點(diǎn)好處:更改器方法可以完成錯(cuò)誤檢查,而只對字段賦值的代碼不會(huì)費(fèi)心這么做。例如,setSalary方法可以檢查工資是否小于0.

????警告:注意不要編寫返回可變對象引用的訪問器方法。在本書之前的一版中,我們的Employee類就違反了這個(gè)設(shè)計(jì)原則,其中g(shù)etHireDay方法返回了一個(gè)Date對象:

????LocalDate類沒有更改器方法,與之不同,Date類有一個(gè)更改器方法setTime,可以設(shè)置毫秒數(shù)。

????Date 對象是可變的,這一點(diǎn)破壞了封裝性。如下:

????出錯(cuò)的原因很微妙。d 和 em2 的hireDay 指向了同一個(gè)對象。因此,對d修改的時(shí)候, hireDay 也受到了影響??梢曰貞浺幌轮霸蹅兲岬降膶ο笠玫南嚓P(guān)內(nèi)容

????如果需要返回一個(gè)可變對象的引用,首先應(yīng)該對它進(jìn)行克?。╟lone)。對象克隆是指存放在另一個(gè)新位置上的對象副本。有關(guān)對象克隆的詳細(xì)內(nèi)容將在第6章中進(jìn)行討論。下面是修改后的代碼:

這里有一個(gè)經(jīng)驗(yàn),如果需要返回一個(gè)可變字段的副本,就應(yīng)該使用clone


個(gè)人建議

????對于這個(gè)代碼,用clone 也好,用其他方式也好,總之,要讓return 的可變對象不能與封裝起來的信息指向同一個(gè)對象,否則對象的指針將被泄漏,就像你的密碼被泄漏一樣危險(xiǎn)。同理,其實(shí)本代碼中,構(gòu)造器那里也是一樣防止泄漏。

具體到Date 類,也可以用以下方式獲得Date 的同值,不同指向的新實(shí)例。這種方式不需要強(qiáng)轉(zhuǎn),會(huì)更加友好

????


java 核心技術(shù)-12版 卷Ⅰ- 4.3.8 封裝的優(yōu)點(diǎn)的評論 (共 條)

分享到微博請遵守國家法律
锡林郭勒盟| 进贤县| 成武县| 高邑县| 霍山县| 新晃| 四平市| 昆明市| 青岛市| 银川市| 临城县| 囊谦县| 蒙城县| 宝清县| 扎鲁特旗| 呼伦贝尔市| 茂名市| 弋阳县| 察雅县| 垫江县| 菏泽市| 皮山县| 册亨县| 汤阴县| 宜兴市| 孟连| 邓州市| 庆安县| 台南市| 大埔县| 温州市| 微博| 新兴县| 通榆县| 壤塘县| 敦化市| 长武县| 宜黄县| 凯里市| 陇川县| 东辽县|