內容介紹
本書分為四部分,第一部分全面介紹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等)並發表演講,人送雅號“開發魔頭”,讚頌他敢於向行業現狀挑戰的精神。
譯者簡介:
吳海星
具有10多年的Java軟體開發經驗,熟悉Java語言規範、基於Java的Web軟體開發以及性能調優,曾獲SCJP及SCWCD證書。
作品目錄
目 錄第一部分 用Java 7做開發
第1章 初識Java 72
1.1 語言與平台2
1.2 Coin項目:濃縮的都是精華4
1.3 Coin項目中的修改7
1.3.1 switch語句中的String7
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/O17
2.1 Java I/O簡史18
2.1.1 Java 1.0到1.319
2.1.2 在Java 1.4中引入的NIO19
2.1.3 下一代I/O-NIO.220
2.2 檔案I/O的基石:Path20
2.2.1 創建一個Path23
2.2.2 從Path中獲取信息23
2.2.3 移除冗餘項24
2.2.4 轉換Path25
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/O28
2.4.1 創建和刪除檔案29
2.4.2 檔案的複製和移動30
2.4.3 檔案的屬性31
2.4.4 快速讀寫數據34
2.4.5 檔案修改通知35
2.4.6 SeekableByteChannel37
2.5 異步 I/O操作37
2.5.1 將來式38
2.5.2 回調式40
2.6 Socket和Channel的整合41
2.6.1 NetworkChannel42
2.6.2 MulticastChannel42
2.7 小結43
第二部分 關鍵技術
第3章 依賴注入46
3.1 知識注入:理解IoC和DI46
3.1.1 控制反轉47
3.1.2 依賴注入48
3.1.3 轉成DI49
3.2 Java中標準化的DI53
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 359
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 為什麼是synchronized77
4.2.6 關鍵字volatile78
4.2.7 不可變性79
4.3 現代並發應用程式的構件80
4.3.1 原子類:java.util. concurrent.atomic81
4.3.2 執行緒鎖:java.util. concurrent.locks81
4.3.3 CountDownLatch85
4.3.4 ConcurrentHashMap86
4.3.5 CopyOnWriteArrayList87
4.3.6 Queue90
4.4 控制執行95
4.4.1 任務建模96
4.4.2 ScheduledThread-PoolExecutor97
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 MethodHandle112
5.2.2 MethodType112
5.2.3 查找方法句柄113
5.2.4 示例:反射、代理與方法句柄114
5.2.5 為什麼選擇MethodHandle116
5.3 檢查類檔案117
5.3.1 介紹javap117
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 invokedynamic129
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 jmap152
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 新的收集器:G1161
6.6 HotSpot的JIT編譯162
6.6.1 介紹HotSpot163
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 GroovyBean199
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調用Java207
8.5.2 從Java調用Groovy208
8.6 小結211
第9章 Scala:簡約而不簡單212
9.1 走馬觀花Scala213
9.1.1 簡約的Scala213
9.1.2 match表達式215
9.1.3 case類217
9.1.4 actor218
9.2 Scala能用在我的項目中嗎219
9.2.1 Scala和Java的比較219
9.2.2 何時以及如何開始使用Scala220
9.2.3 Scala可能不適合當前項目的跡象220
9.3 讓代碼因Scala重新綻放221
9.3.1 使用編譯器和REPL221
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 List235
9.5.2 Map238
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 World246
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中調用Java262
10.5.2 Clojure值的Java類型263
10.5.3 使用Clojure代理264
10.5.4 用REPL做探索式編程264
10.5.5 在Java中使用Clojure265
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 JUnit283
11.2 測試替身285
11.2.1 虛設對象286
11.2.2 存根對象287
11.2.3 偽裝替身290
11.2.4 模擬對象295
11.3 ScalaTest296
11.4 小結298
第12章 構建和持續集成300
12.1 與Maven 3相遇302
12.2 Maven 3入門項目303
12.3 用Maven 3構建Java7developer項目305
12.3.1 POM305
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 Leiningen325
12.6.1 Leiningen入門326
12.6.2 Leiningen的架構326
12.6.3 Hello Lein327
12.6.4 用Leiningen做面向REPL的TDD329
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 深入Grails347
13.5.1 日誌347
13.5.2 GORM:對象關係映射348
13.5.3 Grails外掛程式349
13.6 Compojure入門350
13.6.1 Hello Compojure350
13.6.2 Ring和路由352
13.6.3 Hiccup353
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 POM390