《Java程式設計師修煉之道》是2013年人民郵電出版社出版的圖書,作者是英 Benjamin J. Evans /荷蘭 Martijn Verburg,翻譯是吳海星。
基本介紹
- 作者:Benjamin J. Evans/Martijn Verburg
- 譯者:吳海星
- ISBN:9787115321954
- 頁數:416
- 定價:89.00
- 出版社:人民郵電出版社
- 出版時間:2013-7
- 裝幀:平裝
內容介紹,作者介紹,作品目錄,
內容介紹
本書分為四部分,第一部分全面介紹Java 7 的新特性,第二部分探討Java 關鍵編程知識和技術,第三部分討論JVM 上的新語言和多語言編程,第四部分將平台和多語言編程知識付諸實踐。從介紹Java 7 的新特性入手,本書涵蓋了Java 開發中最重要的技術,比如依賴注入、測試驅動的開發和持續集成,探索了JVM 上的非Java 語言,並詳細講解了多語言項目, 特別是涉及Groovy、Scala 和Clojure 語言的項目。此外,書中含有大量代碼示例,幫助讀者從實踐中理解Java 語言和平台。
本書適合Java 開發人員以及對Java7 和JVM 新語言感興趣的各領域人士閱讀。
作者介紹
作者簡介:
Benjamin J. Evans
是倫敦Java用戶組發起人、Java社區過程執行委員會成員。他擁有多年Java開發經驗,現在是一家面向金融業的Java技術公司的CEO。
Martijn Verburg
是jClarity的CTO、倫敦Java用戶組領導人。作為一名技術專家和眾多初創企業的OSS導師,他擁有十多年的經驗。Martijn經常應邀出席Java界的大型會議(JavaOne、Devoxx、OSCON、FOSDEM等)並發表演講,人送雅號“開發魔頭”,讚頌他敢於向行業現狀挑戰的精神。
譯者簡介:
吳海星
作品目錄
目 錄
第一部分 用Java 7做開發
第1章 初識Java 7 2
1.1 語言與平台 2
1.2 Coin項目:濃縮的都是精華 4
1.3 Coin項目中的修改 7
1.3.1 switch語句中的String 7
1.3.2 更強的數值文本表示法 8
1.3.3 改善後的異常處理 9
1.3.4 try-with-resources(TWR) 11
1.3.5 鑽石語法 13
1.3.6 簡化變參方法調用 14
1.4 小結 15
第2章 新I/O 17
2.1 Java I/O簡史 18
2.1.1 Java 1.0到1.3 19
2.1.2 在Java 1.4中引入的NIO 19
2.1.3 下一代I/O-NIO.2 20
2.2 檔案I/O的基石:Path 20
2.2.1 創建一個Path 23
2.2.2 從Path中獲取信息 23
2.2.3 移除冗餘項 24
2.2.4 轉換Path 25
2.2.5 NIO.2 Path和Java已有的File類 25
2.3 處理目錄和目錄樹 26
2.3.1 在目錄中查找檔案 26
2.3.2 遍歷目錄樹 27
2.4 NIO.2的檔案系統I/O 28
2.4.1 創建和刪除檔案 29
2.4.2 檔案的複製和移動 30
2.4.3 檔案的屬性 31
2.4.4 快速讀寫數據 34
2.4.5 檔案修改通知 35
2.4.6 SeekableByteChannel 37
2.5 異步 I/O操作 37
2.5.1 將來式 38
2.5.2 回調式 40
2.6 Socket和Channel的整合 41
2.6.1 NetworkChannel 42
2.6.2 MulticastChannel 42
2.7 小結 43
第二部分 關鍵技術
第3章 依賴注入 46
3.1 知識注入:理解IoC和DI 46
3.1.1 控制反轉 47
3.1.2 依賴注入 48
3.1.3 轉成DI 49
3.2 Java中標準化的DI 53
3.2.1 @Inject註解 54
3.2.2 @Qualifier註解 55
3.2.3 @Named註解 57
3.2.4 @Scope註解 57
3.2.5 @Singleton註解 57
3.2.6 接口Provider<T> 58
3.3 Java中的DI參考實現:Guice 3 59
3.3.1 Guice新手指南 59
3.3.2 水手繩結:Guice的各種綁定 62
3.3.3 在Guice中限定注入對象的生命周期 64
3.4 小結 66
第4章 現代並發 67
4.1 並發理論簡介 68
4.1.1 解釋Java執行緒模型 68
4.1.2 設計理念 69
4.1.3 這些原則如何以及為何會相互衝突 70
4.1.4 系統開銷之源 71
4.1.5 一個事務處理的例子 71
4.2 塊結構並發(Java 5之前) 72
4.2.1 同步與鎖 73
4.2.2 執行緒的狀態模型 74
4.2.3 完全同步對象 74
4.2.4 死鎖 76
4.2.5 為什麼是synchronized 77
4.2.6 關鍵字volatile 78
4.2.7 不可變性 79
4.3 現代並發應用程式的構件 80
4.3.1 原子類:java.util. concurrent.atomic 81
4.3.2 執行緒鎖:java.util. concurrent.locks 81
4.3.3 CountDownLatch 85
4.3.4 ConcurrentHashMap 86
4.3.5 CopyOnWriteArrayList 87
4.3.6 Queue 90
4.4 控制執行 95
4.4.1 任務建模 96
4.4.2 ScheduledThread-PoolExecutor 97
4.5 分支/合併框架 98
4.5.1 一個簡單的分支/合併例子 99
4.5.2 ForkJoinTask與工作竊取 101
4.5.3 並行問題 102
4.6 Java記憶體模型 103
4.7 小結 104
第5章 類檔案與位元組碼 106
5.1 類載入和類對象 107
5.1.1 載入和連線概覽 107
5.1.2 驗證 108
5.1.3 Class對象 108
5.1.4 類載入器 109
5.1.5 示例:依賴注入中的類載入器 110
5.2 使用方法句柄 111
5.2.1 MethodHandle 112
5.2.2 MethodType 112
5.2.3 查找方法句柄 113
5.2.4 示例:反射、代理與方法句柄 114
5.2.5 為什麼選擇MethodHandle 116
5.3 檢查類檔案 117
5.3.1 介紹javap 117
5.3.2 方法簽名的內部形式 118
5.3.3 常量池 119
5.4 位元組碼 121
5.4.1 示例:反編譯類 121
5.4.2 運行時環境 123
5.4.3 操作碼介紹 124
5.4.4 載入和儲存操作碼 125
5.4.5 數學運算操作碼 125
5.4.6 執行控制操作碼 126
5.4.7 調用操作碼 126
5.4.8 平台操作操作碼 127
5.4.9 操作碼的快捷形式 127
5.4.10 示例:字元串拼接 127
5.5 invokedynamic 129
5.5.1 invokedynamic如何工作 129
5.5.2 示例:反編譯invokedynamic調用 130
5.6 小結 132
第6章 理解性能調優 133
6.1 性能術語 134
6.1.1 等待時間 135
6.1.2 吞吐量 135
6.1.3 利用率 135
6.1.4 效率 135
6.1.5 容量 136
6.1.6 擴展性 136
6.1.7 退化 136
6.2 務實的性能分析法 136
6.2.1 知道你在測量什麼 137
6.2.2 知道怎么測量 137
6.2.3 知道性能目標是什麼 138
6.2.4 知道什麼時候停止最佳化 139
6.2.5 知道高性能的成本 139
6.2.6 知道過早最佳化的危險 140
6.3 哪裡出錯了?我們擔心的原因 140
6.3.1 過去和未來的性能趨勢:摩爾定律 141
6.3.2 理解記憶體延遲層級 142
6.3.3 為什麼Java性能調優存在困難 143
6.4 一個來自於硬體的時間問題 144
6.4.1 硬體時鐘 144
6.4.2 麻煩的nanoTime() 144
6.4.3 時間在性能調優中的作用 146
6.4.4 案例研究:理解快取未命中 147
6.5 垃圾收集 149
6.5.1 基本算法 149
6.5.2 標記和清除 150
6.5.3 jmap 152
6.5.4 與GC相關的JVM參數 155
6.5.5 讀懂GC日誌 156
6.5.6 用VisualVM查看記憶體使用情況 157
6.5.7 逸出分析 159
6.5.8 並發標記清除 160
6.5.9 新的收集器:G1 161
6.6 HotSpot的JIT編譯 162
6.6.1 介紹HotSpot 163
6.6.2 內聯方法 164
6.6.3 動態編譯和獨占調用 165
6.6.4 讀懂編譯日誌 166
6.7 小結 167
第三部分 JVM上的多語言編程
第7章 備選JVM語言 170
7.1 Java 太笨?純粹誹謗 170
7.1.1 整合系統 171
7.1.2 函式式編程的基本原理 172
7.1.3 映射與過濾器 173
7.2 語言生態學 174
7.2.1 解釋型與編譯型語言 175
7.2.2 動態與靜態類型 175
7.2.3 命令式與函式式語言 176
7.2.4 重新實現的語言與原生語言 176
7.3 JVM上的多語言編程 177
7.3.1 為什麼要用非Java語言 178
7.3.2 嶄露頭角的語言新星 179
7.4 如何挑選稱心的非Java語言 180
7.4.1 低風險 181
7.4.2 與Java的互動操作 181
7.4.3 良好的工具和測試支持 182
7.4.4 備選語言學習難度 182
7.4.5 使用備選語言的開發者 182
7.5 JVM對備選語言的支持 183
7.5.1 非Java語言的運行時環境 183
7.5.2 編譯器小說 184
7.6 小結 185
第8章 Groovy:Java的動態伴侶 187
8.1 Groovy入門 189
8.1.1 編譯和運行 189
8.1.2 Groovy控制台 190
8.2 Groovy 101:語法和語義 191
8.2.1 默認導入 192
8.2.2 數字處理 192
8.2.3 變數、動態與靜態類型、作用域 193
8.2.4 列表和映射語法 195
8.3 與Java的差異——新手陷阱 196
8.3.1 可選的分號和返回語句 196
8.3.2 可選的參數括弧 197
8.3.3 訪問限定符 197
8.3.4 異常處理 198
8.3.5 Groovy中的相等 198
8.3.6 內部類 199
8.4 Java不具備的Groovy特性 199
8.4.1 GroovyBean 199
8.4.2 安全解引用操作符 200
8.4.3 貓王操作符 201
8.4.4 增強型字元串 201
8.4.5 函式字面值 202
8.4.6 內置的集合操作 203
8.4.7 對正則表達式的內置支持 204
8.4.8 簡單的XML處理 205
8.5 Groovy與Java的合作 207
8.5.1 從Groovy調用Java 207
8.5.2 從Java調用Groovy 208
8.6 小結 211
第9章 Scala:簡約而不簡單 212
9.1 走馬觀花Scala 213
9.1.1 簡約的Scala 213
9.1.2 match表達式 215
9.1.3 case類 217
9.1.4 actor 218
9.2 Scala能用在我的項目中嗎 219
9.2.1 Scala和Java的比較 219
9.2.2 何時以及如何開始使用Scala 220
9.2.3 Scala可能不適合當前項目的跡象 220
9.3 讓代碼因Scala重新綻放 221
9.3.1 使用編譯器和REPL 221
9.3.2 類型推斷 222
9.3.3 方法 223
9.3.4 導入 224
9.3.5 循環和控制結構 224
9.3.6 Scala的函式式編程 225
9.4 Scala對象模型:相似但不同 226
9.4.1 一切皆對象 226
9.4.2 構造方法 228
9.4.3 特質 228
9.4.4 單例和伴生對象 230
9.4.5 case類和match表達式 232
9.4.6 警世寓言 234
9.5 數據結構和集合 235
9.5.1 List 235
9.5.2 Map 238
9.5.3 泛型 239
9.6 actor介紹 242
9.6.1 代碼大舞台 242
9.6.2 用mailbox跟actor通信 243
9.7 小結 244
第10章 Clojure:更安全地編程 245
10.1 Clojure介紹 245
10.1.1 Clojure的Hello World 246
10.1.2 REPL入門 247
10.1.3 犯了錯誤 248
10.1.4 學著去愛括弧 248
10.2 尋找Clojure:語法和語義 249
10.2.1 特殊形式新手營 249
10.2.2 列表、向量、映射和集 250
10.2.3 數學運算、相等和其他操作 252
10.3 使用函式和循環 253
10.3.1 一些簡單的Clojure函式 253
10.3.2 Clojure中的循環 255
10.3.3 讀取器宏和派發器 256
10.3.4 函式式編程和閉包 257
10.4 Clojure序列 258
10.4.1 懶序列 260
10.4.2 序列和變參函式 261
10.5 Clojure與Java的互操作 262
10.5.1 從Clojure中調用Java 262
10.5.2 Clojure值的Java類型 263
10.5.3 使用Clojure代理 264
10.5.4 用REPL做探索式編程 264
10.5.5 在Java中使用Clojure 265
10.6 Clojure並發 265
10.6.1 未來式與並行調用 266
10.6.2 ref形式 267
10.6.3 代理 271
10.7 小結 272
第四部分 多語種項目開發
第11章 測試驅動開發 274
11.1 TDD概覽 275
11.1.1 一個測試用例 276
11.1.2 多個測試用例 280
11.1.3 深入思考紅—綠—重構循環 282
11.1.4 JUnit 283
11.2 測試替身 285
11.2.1 虛設對象 286
11.2.2 存根對象 287
11.2.3 偽裝替身 290
11.2.4 模擬對象 295
11.3 ScalaTest 296
11.4 小結 298
第12章 構建和持續集成 300
12.1 與Maven 3相遇 302
12.2 Maven 3入門項目 303
12.3 用Maven 3構建Java7developer項目 305
12.3.1 POM 305
12.3.2 運行示例 311
12.4 Jenkins:滿足CI需求 314
12.4.1 基礎配置 315
12.4.2 設定任務 316
12.4.3 執行任務 319
12.5 Maven和Jenkins代碼指標 320
12.5.1 安裝Jenkins外掛程式 321
12.5.2 用Checkstyle保持代碼一致性 322
12.5.3 用FindBugs設定質量標桿 323
12.6 Leiningen 325
12.6.1 Leiningen入門 326
12.6.2 Leiningen的架構 326
12.6.3 Hello Lein 327
12.6.4 用Leiningen做面向REPL的TDD 329
12.6.5 用Leiningen打包和部署 330
12.7 小結 332
第13章 快速Web開發 333
13.1 Java Web框架的問題 334
13.1.1 Java編譯為什麼不好 335
13.1.2 靜態類型為什麼不好 335
13.2 選擇Web框架的標準 336
13.3 Grails入門 338
13.4 Grails快速啟動項目 338
13.4.1 創建域對象 340
13.4.2 測試驅動開發 340
13.4.3 域對象持久化 342
13.4.4 創建測試數據 343
13.4.5 控制器 343
13.4.6 GSP/JSP頁面 344
13.4.7 腳手架和UI的自動化創建 346
13.4.8 快速周轉的開發 347
13.5 深入Grails 347
13.5.1 日誌 347
13.5.2 GORM:對象關係映射 348
13.5.3 Grails外掛程式 349
13.6 Compojure入門 350
13.6.1 Hello Compojure 350
13.6.2 Ring和路由 352
13.6.3 Hiccup 353
13.7 我是不是一隻水獺 353
13.7.1 項目設定 354
13.7.2 核心函式 357
13.8 小結 359
第14章 保持優秀 361
14.1 對Java 8的期待 361
14.1.1 lambda表達式(閉包) 362
14.1.2 模組化(拼圖Jigsaw) 363
14.2 多語言編程 365
14.2.1 語言的互操作性及元對象協定 365
14.2.2 多語言模組化 366
14.3 未來的並發趨勢 367
14.3.1 多核的世界 367
14.3.2 運行時管理的並發 367
14.4 JVM的新方向 368
14.4.1 VM的合併 368
14.4.2 協同程式 369
14.4.3 元組 370
14.5 小結 372
附錄A java7developer:源碼安裝 373
附錄B glob模式語法及示例 380
附錄C 安裝備選JVM語言 382
附錄D Jenkins的下載和安裝 388
附錄E java7developer:Maven POM 390
第一部分 用Java 7做開發
第1章 初識Java 7 2
1.1 語言與平台 2
1.2 Coin項目:濃縮的都是精華 4
1.3 Coin項目中的修改 7
1.3.1 switch語句中的String 7
1.3.2 更強的數值文本表示法 8
1.3.3 改善後的異常處理 9
1.3.4 try-with-resources(TWR) 11
1.3.5 鑽石語法 13
1.3.6 簡化變參方法調用 14
1.4 小結 15
第2章 新I/O 17
2.1 Java I/O簡史 18
2.1.1 Java 1.0到1.3 19
2.1.2 在Java 1.4中引入的NIO 19
2.1.3 下一代I/O-NIO.2 20
2.2 檔案I/O的基石:Path 20
2.2.1 創建一個Path 23
2.2.2 從Path中獲取信息 23
2.2.3 移除冗餘項 24
2.2.4 轉換Path 25
2.2.5 NIO.2 Path和Java已有的File類 25
2.3 處理目錄和目錄樹 26
2.3.1 在目錄中查找檔案 26
2.3.2 遍歷目錄樹 27
2.4 NIO.2的檔案系統I/O 28
2.4.1 創建和刪除檔案 29
2.4.2 檔案的複製和移動 30
2.4.3 檔案的屬性 31
2.4.4 快速讀寫數據 34
2.4.5 檔案修改通知 35
2.4.6 SeekableByteChannel 37
2.5 異步 I/O操作 37
2.5.1 將來式 38
2.5.2 回調式 40
2.6 Socket和Channel的整合 41
2.6.1 NetworkChannel 42
2.6.2 MulticastChannel 42
2.7 小結 43
第二部分 關鍵技術
第3章 依賴注入 46
3.1 知識注入:理解IoC和DI 46
3.1.1 控制反轉 47
3.1.2 依賴注入 48
3.1.3 轉成DI 49
3.2 Java中標準化的DI 53
3.2.1 @Inject註解 54
3.2.2 @Qualifier註解 55
3.2.3 @Named註解 57
3.2.4 @Scope註解 57
3.2.5 @Singleton註解 57
3.2.6 接口Provider<T> 58
3.3 Java中的DI參考實現:Guice 3 59
3.3.1 Guice新手指南 59
3.3.2 水手繩結:Guice的各種綁定 62
3.3.3 在Guice中限定注入對象的生命周期 64
3.4 小結 66
第4章 現代並發 67
4.1 並發理論簡介 68
4.1.1 解釋Java執行緒模型 68
4.1.2 設計理念 69
4.1.3 這些原則如何以及為何會相互衝突 70
4.1.4 系統開銷之源 71
4.1.5 一個事務處理的例子 71
4.2 塊結構並發(Java 5之前) 72
4.2.1 同步與鎖 73
4.2.2 執行緒的狀態模型 74
4.2.3 完全同步對象 74
4.2.4 死鎖 76
4.2.5 為什麼是synchronized 77
4.2.6 關鍵字volatile 78
4.2.7 不可變性 79
4.3 現代並發應用程式的構件 80
4.3.1 原子類:java.util. concurrent.atomic 81
4.3.2 執行緒鎖:java.util. concurrent.locks 81
4.3.3 CountDownLatch 85
4.3.4 ConcurrentHashMap 86
4.3.5 CopyOnWriteArrayList 87
4.3.6 Queue 90
4.4 控制執行 95
4.4.1 任務建模 96
4.4.2 ScheduledThread-PoolExecutor 97
4.5 分支/合併框架 98
4.5.1 一個簡單的分支/合併例子 99
4.5.2 ForkJoinTask與工作竊取 101
4.5.3 並行問題 102
4.6 Java記憶體模型 103
4.7 小結 104
第5章 類檔案與位元組碼 106
5.1 類載入和類對象 107
5.1.1 載入和連線概覽 107
5.1.2 驗證 108
5.1.3 Class對象 108
5.1.4 類載入器 109
5.1.5 示例:依賴注入中的類載入器 110
5.2 使用方法句柄 111
5.2.1 MethodHandle 112
5.2.2 MethodType 112
5.2.3 查找方法句柄 113
5.2.4 示例:反射、代理與方法句柄 114
5.2.5 為什麼選擇MethodHandle 116
5.3 檢查類檔案 117
5.3.1 介紹javap 117
5.3.2 方法簽名的內部形式 118
5.3.3 常量池 119
5.4 位元組碼 121
5.4.1 示例:反編譯類 121
5.4.2 運行時環境 123
5.4.3 操作碼介紹 124
5.4.4 載入和儲存操作碼 125
5.4.5 數學運算操作碼 125
5.4.6 執行控制操作碼 126
5.4.7 調用操作碼 126
5.4.8 平台操作操作碼 127
5.4.9 操作碼的快捷形式 127
5.4.10 示例:字元串拼接 127
5.5 invokedynamic 129
5.5.1 invokedynamic如何工作 129
5.5.2 示例:反編譯invokedynamic調用 130
5.6 小結 132
第6章 理解性能調優 133
6.1 性能術語 134
6.1.1 等待時間 135
6.1.2 吞吐量 135
6.1.3 利用率 135
6.1.4 效率 135
6.1.5 容量 136
6.1.6 擴展性 136
6.1.7 退化 136
6.2 務實的性能分析法 136
6.2.1 知道你在測量什麼 137
6.2.2 知道怎么測量 137
6.2.3 知道性能目標是什麼 138
6.2.4 知道什麼時候停止最佳化 139
6.2.5 知道高性能的成本 139
6.2.6 知道過早最佳化的危險 140
6.3 哪裡出錯了?我們擔心的原因 140
6.3.1 過去和未來的性能趨勢:摩爾定律 141
6.3.2 理解記憶體延遲層級 142
6.3.3 為什麼Java性能調優存在困難 143
6.4 一個來自於硬體的時間問題 144
6.4.1 硬體時鐘 144
6.4.2 麻煩的nanoTime() 144
6.4.3 時間在性能調優中的作用 146
6.4.4 案例研究:理解快取未命中 147
6.5 垃圾收集 149
6.5.1 基本算法 149
6.5.2 標記和清除 150
6.5.3 jmap 152
6.5.4 與GC相關的JVM參數 155
6.5.5 讀懂GC日誌 156
6.5.6 用VisualVM查看記憶體使用情況 157
6.5.7 逸出分析 159
6.5.8 並發標記清除 160
6.5.9 新的收集器:G1 161
6.6 HotSpot的JIT編譯 162
6.6.1 介紹HotSpot 163
6.6.2 內聯方法 164
6.6.3 動態編譯和獨占調用 165
6.6.4 讀懂編譯日誌 166
6.7 小結 167
第三部分 JVM上的多語言編程
第7章 備選JVM語言 170
7.1 Java 太笨?純粹誹謗 170
7.1.1 整合系統 171
7.1.2 函式式編程的基本原理 172
7.1.3 映射與過濾器 173
7.2 語言生態學 174
7.2.1 解釋型與編譯型語言 175
7.2.2 動態與靜態類型 175
7.2.3 命令式與函式式語言 176
7.2.4 重新實現的語言與原生語言 176
7.3 JVM上的多語言編程 177
7.3.1 為什麼要用非Java語言 178
7.3.2 嶄露頭角的語言新星 179
7.4 如何挑選稱心的非Java語言 180
7.4.1 低風險 181
7.4.2 與Java的互動操作 181
7.4.3 良好的工具和測試支持 182
7.4.4 備選語言學習難度 182
7.4.5 使用備選語言的開發者 182
7.5 JVM對備選語言的支持 183
7.5.1 非Java語言的運行時環境 183
7.5.2 編譯器小說 184
7.6 小結 185
第8章 Groovy:Java的動態伴侶 187
8.1 Groovy入門 189
8.1.1 編譯和運行 189
8.1.2 Groovy控制台 190
8.2 Groovy 101:語法和語義 191
8.2.1 默認導入 192
8.2.2 數字處理 192
8.2.3 變數、動態與靜態類型、作用域 193
8.2.4 列表和映射語法 195
8.3 與Java的差異——新手陷阱 196
8.3.1 可選的分號和返回語句 196
8.3.2 可選的參數括弧 197
8.3.3 訪問限定符 197
8.3.4 異常處理 198
8.3.5 Groovy中的相等 198
8.3.6 內部類 199
8.4 Java不具備的Groovy特性 199
8.4.1 GroovyBean 199
8.4.2 安全解引用操作符 200
8.4.3 貓王操作符 201
8.4.4 增強型字元串 201
8.4.5 函式字面值 202
8.4.6 內置的集合操作 203
8.4.7 對正則表達式的內置支持 204
8.4.8 簡單的XML處理 205
8.5 Groovy與Java的合作 207
8.5.1 從Groovy調用Java 207
8.5.2 從Java調用Groovy 208
8.6 小結 211
第9章 Scala:簡約而不簡單 212
9.1 走馬觀花Scala 213
9.1.1 簡約的Scala 213
9.1.2 match表達式 215
9.1.3 case類 217
9.1.4 actor 218
9.2 Scala能用在我的項目中嗎 219
9.2.1 Scala和Java的比較 219
9.2.2 何時以及如何開始使用Scala 220
9.2.3 Scala可能不適合當前項目的跡象 220
9.3 讓代碼因Scala重新綻放 221
9.3.1 使用編譯器和REPL 221
9.3.2 類型推斷 222
9.3.3 方法 223
9.3.4 導入 224
9.3.5 循環和控制結構 224
9.3.6 Scala的函式式編程 225
9.4 Scala對象模型:相似但不同 226
9.4.1 一切皆對象 226
9.4.2 構造方法 228
9.4.3 特質 228
9.4.4 單例和伴生對象 230
9.4.5 case類和match表達式 232
9.4.6 警世寓言 234
9.5 數據結構和集合 235
9.5.1 List 235
9.5.2 Map 238
9.5.3 泛型 239
9.6 actor介紹 242
9.6.1 代碼大舞台 242
9.6.2 用mailbox跟actor通信 243
9.7 小結 244
第10章 Clojure:更安全地編程 245
10.1 Clojure介紹 245
10.1.1 Clojure的Hello World 246
10.1.2 REPL入門 247
10.1.3 犯了錯誤 248
10.1.4 學著去愛括弧 248
10.2 尋找Clojure:語法和語義 249
10.2.1 特殊形式新手營 249
10.2.2 列表、向量、映射和集 250
10.2.3 數學運算、相等和其他操作 252
10.3 使用函式和循環 253
10.3.1 一些簡單的Clojure函式 253
10.3.2 Clojure中的循環 255
10.3.3 讀取器宏和派發器 256
10.3.4 函式式編程和閉包 257
10.4 Clojure序列 258
10.4.1 懶序列 260
10.4.2 序列和變參函式 261
10.5 Clojure與Java的互操作 262
10.5.1 從Clojure中調用Java 262
10.5.2 Clojure值的Java類型 263
10.5.3 使用Clojure代理 264
10.5.4 用REPL做探索式編程 264
10.5.5 在Java中使用Clojure 265
10.6 Clojure並發 265
10.6.1 未來式與並行調用 266
10.6.2 ref形式 267
10.6.3 代理 271
10.7 小結 272
第四部分 多語種項目開發
第11章 測試驅動開發 274
11.1 TDD概覽 275
11.1.1 一個測試用例 276
11.1.2 多個測試用例 280
11.1.3 深入思考紅—綠—重構循環 282
11.1.4 JUnit 283
11.2 測試替身 285
11.2.1 虛設對象 286
11.2.2 存根對象 287
11.2.3 偽裝替身 290
11.2.4 模擬對象 295
11.3 ScalaTest 296
11.4 小結 298
第12章 構建和持續集成 300
12.1 與Maven 3相遇 302
12.2 Maven 3入門項目 303
12.3 用Maven 3構建Java7developer項目 305
12.3.1 POM 305
12.3.2 運行示例 311
12.4 Jenkins:滿足CI需求 314
12.4.1 基礎配置 315
12.4.2 設定任務 316
12.4.3 執行任務 319
12.5 Maven和Jenkins代碼指標 320
12.5.1 安裝Jenkins外掛程式 321
12.5.2 用Checkstyle保持代碼一致性 322
12.5.3 用FindBugs設定質量標桿 323
12.6 Leiningen 325
12.6.1 Leiningen入門 326
12.6.2 Leiningen的架構 326
12.6.3 Hello Lein 327
12.6.4 用Leiningen做面向REPL的TDD 329
12.6.5 用Leiningen打包和部署 330
12.7 小結 332
第13章 快速Web開發 333
13.1 Java Web框架的問題 334
13.1.1 Java編譯為什麼不好 335
13.1.2 靜態類型為什麼不好 335
13.2 選擇Web框架的標準 336
13.3 Grails入門 338
13.4 Grails快速啟動項目 338
13.4.1 創建域對象 340
13.4.2 測試驅動開發 340
13.4.3 域對象持久化 342
13.4.4 創建測試數據 343
13.4.5 控制器 343
13.4.6 GSP/JSP頁面 344
13.4.7 腳手架和UI的自動化創建 346
13.4.8 快速周轉的開發 347
13.5 深入Grails 347
13.5.1 日誌 347
13.5.2 GORM:對象關係映射 348
13.5.3 Grails外掛程式 349
13.6 Compojure入門 350
13.6.1 Hello Compojure 350
13.6.2 Ring和路由 352
13.6.3 Hiccup 353
13.7 我是不是一隻水獺 353
13.7.1 項目設定 354
13.7.2 核心函式 357
13.8 小結 359
第14章 保持優秀 361
14.1 對Java 8的期待 361
14.1.1 lambda表達式(閉包) 362
14.1.2 模組化(拼圖Jigsaw) 363
14.2 多語言編程 365
14.2.1 語言的互操作性及元對象協定 365
14.2.2 多語言模組化 366
14.3 未來的並發趨勢 367
14.3.1 多核的世界 367
14.3.2 運行時管理的並發 367
14.4 JVM的新方向 368
14.4.1 VM的合併 368
14.4.2 協同程式 369
14.4.3 元組 370
14.5 小結 372
附錄A java7developer:源碼安裝 373
附錄B glob模式語法及示例 380
附錄C 安裝備選JVM語言 382
附錄D Jenkins的下載和安裝 388
附錄E java7developer:Maven POM 390