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