本書是經典Jolt獲獎作品《Effective Java》的第3版,對上一版進行了全面更新,涵蓋了從Java 5到Java 9的種種特性,是Java開發(fā)人員不可缺少的一本參考書。
本書分為12章,包含90個條目,形式簡潔。每個條目中都講述了對Java的獨到見解,闡明了如何編寫高效、優(yōu)雅的程序,并且提供了清晰、易懂的示例代碼。與上一版相比,本書增加了Lambda表達式、流、Optional類、接口默認方法、try-with-resources、@SafeVarargs注解、模塊等Java 7及以后所引入的新特性。本書介紹了如何充分利用泛型、枚舉、注解、自動裝箱、for-each循環(huán)、可變參數(shù)、并發(fā)機制等各種特性,幫助讀者更加有效地使用Java編程語言及其基本類庫:java.lang、java.util和java.io,以及子包,如java.util.concurrent和java.util.function等。
本書并非面向Java初學者,而是要求讀者有一定的Java編程經驗。對于在Java開發(fā)方面已經積累一定經驗的讀者而言,本書可以幫助其更深入地理解Java編程語言,以成為更卓越、高效的Java開發(fā)人員。
Jolt獲獎作品全新升級版,針對Java7、8、9全面更新,Java之父James Gosling鼎力推薦,Java程序員的實用參考書
全書包含90個條目,通過示例代碼全面描述和透徹解釋Java新特性
約書亞·布洛克(Joshua Bloch)是美國卡內基-梅隆大學教授,曾是Google公司首席Java架構師、Sun公司杰出工程師和Transarc公司高級系統(tǒng)設計師。他帶領團隊設計和實現(xiàn)過無數(shù)的Java平臺特性,包括JDK 5.0語言增強版和獲獎的Java Collections Framework。他擁有哥倫比亞大學的計算機科學學士學位和卡內基-梅隆大學的計算機科學博士學位。他的著作還包括Java Puzzlers和《Java并發(fā)編程實戰(zhàn)》(Java Concurrency in Practice,曾獲Jolt大獎提名)等。
目錄
序言 6
前言 7
第3版前言 7
第 2版前言 7
第 1版前言 8
致謝 9
第3版致謝 9
第 2版致謝 10
第 1版致謝 11
第 1章 引言 13
第 2章 創(chuàng)建和銷毀對象 16
條目1:用靜態(tài)工廠方法代替構造器 16
條目2:當構造器參數(shù)較多時考慮使用生成器 19
條目3:利用private構造器或枚舉類型實現(xiàn)單件 26
條目4:利用private構造器防止類被實例化 28
條目5:優(yōu)先考慮通過依賴注入來連接資源 29
條目6:避免創(chuàng)建不必要的對象 31
條目7:清除過期的對象引用 34
條目8:避免使用終結方法和清理方法 36
條目9:與try-finally相比,首選try-with-resources 41
第3章 所有對象通用的方法 44
條目10:在重寫equals方法時要遵守通用約定 44
條目11:重寫equals方法時應該總是重寫hashCode方法 55
條目12:總是重寫toString方法 59
條目13:謹慎重寫clone方法 61
條目14:考慮實現(xiàn)Comparable接口 68
第4章 類和接口 74
條目15:最小化類和成員的可訪問性 74
條目16:在公開類中,使用訪問方法,而不使用public的字段 77
條目17:使可變性最小化 79
條目18:組合優(yōu)先于繼承 85
條目19:要么為繼承而設計并提供文檔說明;要么就禁止繼承 90
條目20:與抽象類相比,優(yōu)先選擇接口 95
條目21:為傳諸后世而設計接口 99
條目22:接口僅用于定義類型 101
條目23:優(yōu)先使用類層次結構而不是標記類 102
條目24:與非靜態(tài)成員類相比,優(yōu)先選擇靜態(tài)成員類 105
條目25:限制在一個源文件中放一個頂層類 107
第5章 泛型 109
條目26:不要使用原始類型 110
條目27:消除unchecked類型的警告 114
條目28:列表優(yōu)先于數(shù)組 116
條目29:首選泛型類型 120
條目30:首選泛型方法 124
條目31:使用有限制的通配符增加API的靈活性 128
條目32:謹慎混用泛型和可變參數(shù) 133
條目33:考慮類型安全的異構容器 137
第6章 枚舉和注解 142
條目34:使用enum代替int常量 142
條目35:使用實例字段代替序號 152
條目36:使用EnumSet代替位域 153
條目37:不要以序號作為索引,使用EnumMap代替 154
條目38:使用接口模擬可擴展的枚舉 159
條目39:與命名模式相比首選注解 162
條目40:始終使用Override注解 169
條目41:使用標記接口來定義類型 171
第7章 Lambda表達式和流 173
條目42:與匿名類相比,優(yōu)先選擇Lambda表達式 173
條目43:與Lambda表達式相比,優(yōu)先選擇方法引用 176
條目44:首選標準的函數(shù)式接口 178
條目45:審慎地使用流 181
條目46:在流中首選沒有副作用的函數(shù) 187
條目47:作為返回類型時,首選集合類而不是流 191
條目48:將流并行化時要謹慎 196
第8章 方法 200
條目49:檢查參數(shù)的有效性 200
條目50:必要時進行保護性拷貝 203
條目51:仔細設計方法簽名 207
條目52:謹慎使用重載 208
條目53:謹慎使用可變參數(shù) 214
條目54:返回空的集合或數(shù)組,而不是null 215
條目55:謹慎返回Optional 217
條目56:為所有導出的API元素編寫文檔注釋 221
第9章 通用編程 227
條目57:最小化局部變量的作用域 227
條目58:與傳統(tǒng)的for循環(huán)相比,首選for-each循環(huán) 230
條目59:了解并使用庫 232
條目60:如果需要精確的答案,避免使用float和double 235
條目61:首選基本類型,而不是其封裝類 237
條目62:如果其他類型更適合,就不要使用字符串 239
條目63:注意字符串連接操作的性能 241
條目64:通過接口來引用對象 242
條目65:與反射相比,首選接口 244
條目66:謹慎使用本地方法 246
條目67:謹慎進行優(yōu)化 247
條目68:遵循普遍接受的命名慣例 249
第 10章 異常 253
條目69:異常機制應該僅用于異常的情況 253
條目70:對于可恢復的條件,使用檢查型異常;對于編程錯誤,使用運行時異常 255
條目71:避免不必要地使用檢查型異常 256
條目72:優(yōu)先使用標準異常 258
條目73:拋出適合于當前抽象的異常 260
條目74:將每個方法拋出的所有異常都寫在文檔中 261
條目75:將故障記錄信息包含在詳細信息中 263
條目76:努力保持故障的原子性 264
條目77:不要忽略異常 266
第 11章 并發(fā) 267
條目78:同步對共享可變數(shù)據(jù)的訪問 267
條目79:避免過度同步 271
條目80:與線程相比,首選執(zhí)行器、任務和流 276
條目81:與wait和notify相比,首選高級并發(fā)工具 278
條目82:將線程安全性寫在文檔中 282
條目83:謹慎使用惰性初始化 285
條目84:不要依賴線程調度器 287
第 12章 序列化 290
條目85:優(yōu)先選擇其他序列化替代方案 290
條目86:在實現(xiàn)Serializable接口時要特別謹慎 293
條目87:考慮使用自定義的序列化形式 295
條目88:防御性地編寫readObject方法 301
條目89:對于實例受控的類,首選枚舉類型而不是readResolve 306
條目90:考慮使用序列化代理代替序列化實例 310
附錄 與第 2版中條目的對應關系 314
參考文獻 317