Java讀源碼技巧1--內(nèi)部類和條件判斷

1、內(nèi)部類

jdk源碼中大量使用內(nèi)部類另假,有必要整理歸納內(nèi)部類的特性,有利于更好理解源碼怕犁,同樣有利于提高編碼技巧边篮。推薦一篇博文 Java內(nèi)部類
這里拿最常見三種內(nèi)部類來討論奏甫,即成員內(nèi)部類戈轿、匿名內(nèi)部類和靜態(tài)內(nèi)部類。

  • 成員內(nèi)部類能無條件訪問外部類的成員變量和成員方法阵子。外部類想訪問內(nèi)部類就沒那么簡單思杯,必須創(chuàng)建外部類實例,通過引用訪問內(nèi)部類成員變量和成員方法挠进。編譯的class文件有兩個色乾,一個是Outer.class,一個是Outer$Inner.class奈梳。
  • 匿名內(nèi)部類一般用于繼承抽象類或者事件接口杈湾,常用于監(jiān)聽事件、多線程編程中攘须。編譯的class文件也有兩個漆撞,一個是Outer.class,另一個是Outer$1.class于宙。另外浮驳,匿名內(nèi)部類引用外部變量必須為final類型。
  • 靜態(tài)內(nèi)部類的class前多了一個static修飾捞魁,不用依賴外部類的實例化至会,這點很像靜態(tài)變量和靜態(tài)方法,另外谱俭,不允許訪問外部非靜態(tài)變量和非靜態(tài)方法奉件。

內(nèi)部類的使用使代碼可讀性增強,有利于理解數(shù)據(jù)結構昆著,實際上java并發(fā)包中大量的Node县貌、Worker內(nèi)部類承載就是鏈表、線程等數(shù)據(jù)模型凑懂。在編碼一個大的任務時煤痕,通常可以借鑒,避免使用大量的集合框架摆碉,比如用HashMap承載了一個model塘匣,不如定義內(nèi)部類描述model的數(shù)據(jù)結構。

1.1巷帝、關于內(nèi)部類常見的3個問題

  • 第一忌卤、成員內(nèi)部類源何能夠無條件訪問外部類的成員變量和成員方法?
    答:通過內(nèi)部類的class文件Outer$Inner.class反編譯發(fā)現(xiàn)楞泼,其內(nèi)部定義了成員變量this$0埠巨,雖然默認是無參的構造函數(shù),但是編譯器在編譯的時候會把Outer引用傳給this$0變量现拒,這樣辣垒,成員內(nèi)部類就能夠無條件的訪問外部成員變量和成員方法。另外靜態(tài)內(nèi)部類并不持有該變量印蔬。

  • 第二勋桶、傳參給匿名內(nèi)部類源何必須用final限定?
    答:通常匿名內(nèi)部類用在多線程中侥猬,程序并不是順序執(zhí)行的例驹,外部方法跑完了,變量生命周期結束退唠,有可能被垃圾回收器識別并回收鹃锈,但是匿名內(nèi)部類可能仍在引用,外部線程已經(jīng)標記該變量生命結束瞧预,內(nèi)部線程卻仍在引用屎债,這就不合理,java采用的方式復制的手段解決問題垢油,反編譯后發(fā)現(xiàn)盆驹,編譯器在局部內(nèi)部類的常量引用池中添加一個相等的引用。這樣一來局部內(nèi)部類引用就是另一個與原變量相等的變量滩愁,因此完全和方法中的變量區(qū)分開躯喇。

  • 第三、外部類如何實例化內(nèi)部類硝枉?
    答:參見如下代碼:

局部內(nèi)部類:
Outer outer = new Outer;
Outer.Inner inner = outer.new Inner();
靜態(tài)內(nèi)部類:
Outer.Inner inner = new Outer.Inner();

2廉丽、條件判斷的異常含義

很多語言都有條件判斷的前置,其針對 ||&& 操作妻味。

  • || 表示或關系正压,實際上還有 當前成功就停止 的意思,具體表示:跑到最近的一個真 或者 跑到最后一個假弧可。

  • && 表示與操作蔑匣,實際上還有 最后一個成功才成功 意思,具體表示:跑到最后一個真 或者 跑到最近一個假棕诵。

  • 上述兩點是Java的釋義裁良,實際上JavaScript應用更加廣泛,常運用在return語句上校套,臣燮ⅲ看源碼發(fā)現(xiàn),很多函數(shù)就是一句包含return的語句笛匙,這里跟Java略有不用侨把,JavaScript總結起來:|| 表示 返回最近的一個真 或者 返回最后的一個假&& 表示 返回最近一個假 或者 返回最后一個真妹孙。另外秋柄,JavaScript里面返回的并不一定是true、false蠢正,也可能數(shù)值骇笔、字符串、對象等嚣崭,只是數(shù)值笨触、字符串、對象能夠表示布爾值雹舀。

下面通過一組例子說明這種關系芦劣,筆者截取java.util.concurrent.Semaphore中的源碼,能夠發(fā)現(xiàn)一些問題说榆。
源碼:

final int nonfairTryAcquireShared(int acquires) {
    for (;;) {
        int available = getState();
        int remaining = available - acquires;
        if (remaining < 0 || compareAndSetState(available, remaining))
            return remaining;
    }
}

我的寫法:

final int nonfairTryAcquireShared(int acquires) {
    for (;;) {
        int available = getState();
        int remaining = available - acquires;
        if (remaining >= 0) {
            if (compareAndSetState(available, remaining)) {
                return remaining;
            }
        }
    }
}

各位看官虚吟,都瞧出來了吧,源碼更簡潔(ps:這里批判一下簡書签财,代碼引用不能加行號)稍味。源碼8行搞定,我的寫法11行荠卷,差別在于多了一層if嵌套模庐,源碼中只有一個if判斷,縮減為一行油宜,用逆向思維寫的更為精巧掂碱,我的正向思維是:只有remaining大于等于0才能夠執(zhí)行cas操作,因此我的寫更為直觀易懂慎冤。jdk為了追求簡潔大量運用這種技巧疼燥,這只是兩個條件的判斷,還有3個條件及以上的更為復雜蚁堤,需仔細推敲醉者!

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子撬即,更是在濱河造成了極大的恐慌立磁,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剥槐,死亡現(xiàn)場離奇詭異唱歧,居然都是意外死亡,警方通過查閱死者的電腦和手機粒竖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門颅崩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蕊苗,你說我怎么就攤上這事沿后。” “怎么了朽砰?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵得运,是天一觀的道長。 經(jīng)常有香客問我锅移,道長熔掺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任非剃,我火速辦了婚禮置逻,結果婚禮上,老公的妹妹穿的比我還像新娘备绽。我一直安慰自己券坞,他們只是感情好,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布肺素。 她就那樣靜靜地躺著恨锚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪倍靡。 梳的紋絲不亂的頭發(fā)上猴伶,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機與錄音塌西,去河邊找鬼他挎。 笑死,一個胖子當著我的面吹牛捡需,可吹牛的內(nèi)容都是我干的办桨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼站辉,長吁一口氣:“原來是場噩夢啊……” “哼呢撞!你這毒婦竟也來了损姜?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤殊霞,失蹤者是張志新(化名)和其女友劉穎摧阅,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脓鹃,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年古沥,在試婚紗的時候發(fā)現(xiàn)自己被綠了瘸右。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡岩齿,死狀恐怖太颤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盹沈,我是刑警寧澤龄章,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站乞封,受9級特大地震影響做裙,放射性物質發(fā)生泄漏。R本人自食惡果不足惜肃晚,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一锚贱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧关串,春花似錦拧廊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至墓卦,卻和暖如春倦春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背落剪。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工溅漾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人著榴。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓添履,卻偏偏與公主長得像,于是被迫代替她去往敵國和親脑又。 傳聞我的和親對象是個殘疾皇子暮胧,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355