Chapter4 Item14 在公有類中使用訪問方法而不是公有域

你可能偶爾需要編寫退化類糯笙,目的只是為了集中實例域:

 // Degenerate classes like this should not be public!
   class Point {
       public double x;
       public double y;
   }

標準寫法是:

// Encapsulation of data by accessor and mutators  
class Point {  
  private double x;  
  private double y;  
  
  public Point(double x, double y) {  
    this.x = x;  
    this.y = y;  
  }  
  
  public double getX() { return x; }  
  public double getY() { return y; }  
  public void setX(double x) { this.x = x; }  
  public void setY(double y) { this.y = y; }  
} 

如果一個類可以被包外訪問施流,那么就要提供訪問方法垦缅,以便可以靈活地改變類的內(nèi)部表示自赔。如果public類暴露了其數(shù)據(jù)域,則要想在將來改變內(nèi)部表示是不可能的背犯,因為他的客戶端代碼可能已經(jīng)遍布各處了坏瘩。
然而,如果類是package-private或是private嵌套類漠魏,那么把數(shù)據(jù)域暴露出去并沒有本質(zhì)的錯誤——假設(shè)這些數(shù)據(jù)域充分描述了該類提供的抽象倔矾。無論是在類定義中,還是在客戶端代碼中柱锹,這種方法相對于訪問方法更不會產(chǎn)生視覺混亂哪自。雖然客戶端代碼與類的內(nèi)部表示緊密相連,但這些代碼被限定在同一個包中禁熏。如果需要改變內(nèi)部數(shù)據(jù)表示壤巷,你不必修改包外的任何代碼。如果是private嵌套類瞧毙,則甚至不需要修改類外的任何代碼胧华。

除非修改其API,否則你不能修改其內(nèi)部數(shù)據(jù)表示宙彪,而且當別人讀取該字段時 你不能采取任何附加行動矩动,但是你可以強加約束條件(——因為只有你自己可以set該字段)
補救辦法: public域加入約束條件

// public class with exposed immutable fields - questionable  
public final class Time {  
  private static final int HOUR_PER_DAY = 24;  
  private static final int MINUTES_PER_HOUR = 60;  
  
  public final int hour;  
  public final int minute;  
  
  public Time() {  
    //強加約束條件  
    if (hour < 0 || hour >= HOUR_PER_DAY) {  
       throw new IllegalArgumentException();  
    if (minute < 0 || minute >= MINUTES_PER_HOUR) {  
       throw new IllegalArgumentException();  
      
    this.hour = hour;  
    this.minute = minute;  
  }  
  
}

Summary

public類永遠不要暴露其可變的字段。而public類暴露其不可變字段雖然是有問題释漆,但危害性要小一些悲没。然而,package-private或者private的嵌套類暴露其字段則是可行的灵汪,無論該字段是可變還是非可變檀训。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末柑潦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子峻凫,更是在濱河造成了極大的恐慌渗鬼,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荧琼,死亡現(xiàn)場離奇詭異譬胎,居然都是意外死亡,警方通過查閱死者的電腦和手機命锄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門堰乔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人脐恩,你說我怎么就攤上這事镐侯。” “怎么了驶冒?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵苟翻,是天一觀的道長。 經(jīng)常有香客問我骗污,道長崇猫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任需忿,我火速辦了婚禮诅炉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘屋厘。我一直安慰自己涕烧,他們只是感情好,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布汗洒。 她就那樣靜靜地躺著澈魄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪仲翎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天铛漓,我揣著相機與錄音溯香,去河邊找鬼。 笑死浓恶,一個胖子當著我的面吹牛玫坛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播包晰,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼湿镀,長吁一口氣:“原來是場噩夢啊……” “哼炕吸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起勉痴,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤赫模,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蒸矛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瀑罗,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年雏掠,在試婚紗的時候發(fā)現(xiàn)自己被綠了斩祭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡乡话,死狀恐怖摧玫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绑青,我是刑警寧澤诬像,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站时迫,受9級特大地震影響颅停,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜掠拳,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一癞揉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧溺欧,春花似錦喊熟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至聂使,卻和暖如春壁拉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背柏靶。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工弃理, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人屎蜓。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓痘昌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子辆苔,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法算灸,類相關(guān)的語法,內(nèi)部類的語法驻啤,繼承相關(guān)的語法菲驴,異常的語法,線程的語...
    子非魚_t_閱讀 31,622評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理街佑,服務(wù)發(fā)現(xiàn)谢翎,斷路器,智...
    卡卡羅2017閱讀 134,651評論 18 139
  • 前言 人生苦多沐旨,快來 Kotlin 森逮,快速學習Kotlin! 什么是Kotlin磁携? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,201評論 9 118
  • 不知道你最近怎么樣褒侧,莫名想你 。 說實話谊迄,我現(xiàn)在也不是很好 此前一個月闷供,什么也沒做,毫無長進统诺。虛度了時光歪脏,浪費大好...
    泠弋閱讀 321評論 0 0
  • 轉(zhuǎn)載請注明出處,感謝您的支持粮呢。同時婿失,歡迎加入移動開發(fā)學習交流qq群 : 450302004,互相學習啄寡。文章來源:【...
    chenyk閱讀 513評論 0 11