本書囊括了筆者多年編程經驗總結出的六項編輯密技:完美規約、完美視角、完美利用、完美改造、完美優化、完美突破,這六項密技是完美編程的精髓,亦是完美編程的指導思想與靈魂。本書還包含77個經典優化案例及28種常用優化技巧。
適讀人群 :軟件開發人員及相關專業師生
Java是目前的主流開發技術,如何更好地發揮其技術優勢實現資源配置和獲得更高商業價值,一直是Java技術發展的趨勢。然而Java體系龐大、技術精深,如何寫出優質代碼,如何設計與優化系統架構,是高級開發者必須掌握的核心技術之一。本書所面向的讀者主要是那些想在技術領域成為佼佼者的朋友:
1.走在架構師之路上的工程師。
2.希望提高自己代碼質量水平的程序員。
3.追求完美的技術愛好者。
總之,無論是在校大學生還是剛剛走上工作崗位的新員工,無論是做編碼的程序員還是做測試的技術人員,無論是架構師還是項目經理,都可以從本書中獲得有益的收獲。
在武俠世界里,凡是頂尖的高手,要么是經歷了一些奇遇偶得真傳,要么就是經過幾十年腳踏實地的修煉,才得以爐火純青。雖然路不同,但他們最核心的修煉內容就是增強自己的內力。內功心法才是核心,因為劍法、拳法之類對聰明人來講看一遍就會,而內力卻很難速成。到達一定的境界后,武功就不分什么門派了,因為這都是融會貫通的。
現實科技世界與武俠科幻世界同理,Java程序世界里也不乏頂尖高手,比如Bruce Eckel (《Thinking In Java》作者)、Joshua Bloch(Google首席Java架構師,《Effective Java》作者)、 Kent Beck(敏捷之父)、Martin Fowler(優化之父)等等。這些人之所以如此成功,并讓追求者頂禮膜拜,并不是因為他們寫了汗牛充棟的程序代碼,而在于他們一出手就能展現絕頂高手的風范,寫出令人拍案叫絕的高質量代碼。因為這代表了他們的品牌與實力,他們會一直精益求精,不斷優化,他們把自己的悟道——如何修煉內功秘籍——寫成了書,就成了經典。
程序員修煉內功心法的終極目標就是成為我們夢寐以求的架構師。眾所周知的《Java編程思想》《Java高效編程》《敏捷軟件開發》《設計模式》《優化》《人月神話》等巨著的核心內容之一就是教授這些內功心法,本書也正是作者多年修煉的總結。品質體現于細節,本書不但從宏觀到細節進行了全面系統的介紹,而且形成了代碼質量優化的理論與技巧體系,是進行代碼優化不可多得的寶典。
顏廷吉,山東臨沂人,畢業于北京大學軟件與微電子學院,碩士學位。上海頤凡軟件科技有限公司創始人兼首席架構師,高級系統工程師,“頤凡Java應用開發平臺”軟件著作權人,擁有PMP、OCP、LIP3等各種高級國際技術認證證書,日本國家高度人才。
2007年就職于NTTDATA集團公司,任研發部主任,從事一線軟件研發與設計近十年。曾經主導與參與了日本厚生勞動省HelloWork就職勞動項目、
Taspo全國香煙自動販賣項目、飲料自動販賣機販賣信息采集項目等大型系統的設計與研發,曾連續多年獲得公司社長獎,項目獎等各種獎項。
序
前言
第1章 代碼質量 1
1.1 什么是代碼質量 1
1.2 什么是軟件質量 1
1.3 代碼質量與軟件質量 1
1.4 代碼質量優化理論 2
1.5 提高代碼質量手段 3
小結 3
第2章 代碼質量靜態檢查工具 4
2.1 靜態分析技術概述 4
2.2 靜態分析技術原理 4
2.3 靜態分析技術給我們帶來的好處 5
2.4 常用重要靜態分析工具 6
2.5 如何優化靜態分析工具 6
小結 11
第3章 代碼質量優化通用準則 12
3.1 避免使用空塊 12
3.2 避免使用空類 15
3.3 去掉多余的import 16
3.4 剪切無效代碼 17
3.5 制定命名體系規約 18
編程解密一:完美規約 20
優化技巧01:按照命名規約賦予名稱 20
3.6 去掉重復代碼 21
3.7 如何優雅使用switch語句 22
3.8 用大寫“L”代替小寫“l”定義long變量 24
3.9 避免在一條語句中聲明或賦值多個變量 25
3.10 去掉控制標志的臨時變量 26
優化技巧02:移除控制標志臨時變量 27
3.11 避免賦予臨時變量過多的角色 28
優化技巧03:賦予臨時變量單一職責 29
3.12 避免使用魔法數字 29
優化技巧04:用常量取代魔法數字 30
3.13 在for循環內修正增量因子有什么弊端 31
3.14 用Enum代替Integer類型碼常量 32
優化技巧05:用枚舉取代類型碼 34
3.15 用BigDecimal類型進行精確計算 35
3.16 避免混用“+” 36
3.17 避免混用復雜運算符 37
3.18 避免使用復雜條件式或分支 38
優化技巧06:用代碼片段拆分復雜表達式 41
優化技巧07:用衛語句代替嵌套條件表達式 42
優化技巧08:用多態代替條件表達式 43
3.19 如何深入理解“= =”的真正含義 44
3.20 要習慣于用泛型代替原生類型 48
3.21 如何正確使用通配符的邊界 53
3.22 如何發揮正則表達式的威力 55
小結 58
第4章 方法優化技巧 59
4.1 最小化原則 59
優化技巧09:封裝類成員 60
4.2 hashCode()與equals()是個孿生兄弟 61
4.3 使用string.equals("String")帶來的弊端 66
4.4 避免命名不具有繼承關系的同名方法 67
4.5 檢查參數的有效性 68
4.6 避免使用可變參數 69
4.7 如何優化過長參數 72
優化技巧10:把參數提升成類成員變量 73
優化技巧11:引入參數對象 74
4.8 為什么不要重寫靜態方法 75
4.9 避免使用過時的API 77
4.10 優雅的集合運算方法知多少 78
4.11 避免重復發明輪子 81
4.12 如何對臃腫的方法進行瘦身 82
優化技巧12:分解方法 84
優化技巧13:合并方法 85
小結 85
第5章 如何保證多線程代碼質量 86
5.1 為什么不要重寫start()方法 86
5.2 避免使用非線程安全的初始化方法 87
5.3 用final成員對象作為同期化對象鎖 90
5.4 在synchronized內使用wait()方法 92
5.5 盡量縮小同期化代碼范圍 93
小結 94
第6章 如何優化類與接口 95
6.1 避免創建不必要的對象 95
6.2 避免使用對象的淺拷貝 96
6.3 如何正確放置靜態區位置 100
6.4 為什么不要使用靜態引入 102
6.5 如何正確使用instanceof 103
6.6 避免實例化特有工具類 106
6.7 避免有深度耦合的類關系 107
優化技巧14:移動變量 110
優化技巧15:移動方法 112
6.8 如何為臃腫的類進行手術 114
優化技巧16:分解類 116
6.9 如何優化冗贅類 117
優化技巧17:合并類 118
6.10 避免在接口中出現實現代碼 119
小結 120
第7章 如何正確使用異常 121
7.1 避免定義繼承Error或Throwable子類 121
7.2 避免拋出RuntimeException或Exception 122
7.3 避免捕獲NullPointerException或Error 124
7.4 避免在finally塊中處理返回值 125
7.5 避免使失敗失去原子性 127
7.6 如何對異常進行封裝 128
優化技巧18:用異常代替錯誤碼 129
7.7 將優雅的異常信息反饋給用戶 130
7.8 避免亂用異常 131
小結 133
第8章 如何優化代碼性能 134
8.1 避免在大量字符串拼接時用“+” 134
8.2 避免在循環體內生成臨時對象 135
8.3 在頻繁插入與刪除時使用LinkedList 137
8.4 在文件操作后要進行清理動作 139
編程解密四:完美改造 140
8.5 避免顯示調用finalized()方法 142
小結 143
第9章 架構優化 144
9.1 單一職責原則 144
優化技巧19:梳理并分解類職責 145
9.2 接口隔離原則 147
優化技巧20:隔離接口 149
9.3 依賴倒置原則 151
優化技巧21:提煉接口 152
9.4 里式替換原則 154
9.5 最少知道原則 155
9.6 如何擴展外部類功能 159
優化技巧22:引入本地擴展 160
9.7 如何梳理混雜的架構體系 160
優化技巧23:以委托代替繼承 165
優化技巧24:封裝向下轉型 165
優化技巧25:提煉繼承體系 167
優化技巧26:折疊繼承體系 169
小結 170
第10章 包優化 172
10.1 發布等價原則 172
10.2 共同重用原則 173
10.3 共同封閉原則 174
10.4 無環依賴原則 176
10.5 如何保持包的清晰 179
優化技巧28:規整包中類位置 180
編程解密五:完美優化 181
10.6 如何抽出框架層次 182
10.7 如何提取框架工程 183
小結 189
第11章 優良代碼風格 190
11.1 如何優化代碼格式工具 190
11.2 如何統一標準的代碼格式 193
11.3 養成良好的代碼注釋習慣 194
編程解密六:完美突破 196
小結 198
結束語 199
附錄 200
參考文獻 229