Effective Java中文版(原書第3版) ( 簡體 字) |
作者:〔美〕約書亞·布洛克(Joshua Bloch)著 | 類別:1. -> 程式設計 -> JAVA -> Java |
譯者: |
出版社:機械工業出版社 | 3dWoo書號: 50472 詢問書籍請說出此書號!【缺書】 NT售價: 595 元 |
出版日:12/1/2018 |
頁數:288 |
光碟數:0 |
|
站長推薦: |
印刷:黑白印刷 | 語系: ( 簡體 版 ) |
|
加入購物車 │加到我的最愛 (請先登入會員) |
ISBN:9787111612728 |
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 序 |
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證) |
作者序: |
譯者序: |
前言:第3版前言
1997年,Java才面世不久,James Gosling(Java之父)稱之為“超級簡單的藍領語言”〔Gosling97〕。幾乎與此同時,Bjarne Stroustrup(C++之父)則將C++稱為“多范式語言”(multi-paradigm language),因為“它與那些只支持單一編程方法的程序語言有著天壤之別”〔Stroustrup95〕。Stroustrup曾發出過這樣的警告:
正如大多數剛面世的語言一樣,Java的相對簡單性,很可能一部分是出于錯覺,一部分是因為其尚不完整而導致的結果。隨著時間的推移,Java在規模和復雜度方面都會顯著增長。到那時,其規模可能呈雙倍甚至三倍增長,并產生大量依賴于實現的擴展或者類庫〔Stroustrup〕。
現在,二十年過去了,坦白地說,Gosling和Stroustrup說的都沒有錯。Java現在果然是既龐大又復雜,許多東西都帶有多個抽象,從并發執行,到迭代,再到日期和時間的表示法。
隨著Java平臺的發展,我的熱情有所降溫,但我依然鐘愛Java。考慮到Java日益增加的規模和復雜度,對于最前沿的最佳實踐指導的需求成了重中之重。在本書中,我將不遺余力地為讀者提供這樣的指導。希望這一版能夠在堅持前兩個版本的精神的前提下,繼續滿足讀者的最新需求。
簡單即美,但要做到大道至簡卻實屬不易。
Joshua Bloch
San Jose, California
2017年11月
附:近年來,我在業界的最佳實踐方面花費了大量的精力。自20世紀50年代誕生這個行業以來,我們已經自由地重新實現了彼此的API。這個實踐對于計算機技術的快速成功至關重要。我始終積極地致力于維護這種自由〔CompSci17〕,并且鼓勵你們也加入到這個行列中來。我們的專業要想持續健康地發展,確保重新實現各自API的權利顯得尤為重要。
第2版前言
自從我于2001年寫了本書的第1版之后,Java平臺又發生了很多變化,是該出第2版的時候了。Java 5中最為重要的變化是增加了泛型、枚舉類型、注解、自動裝箱和for-each
循環。其次是增加了新的并發類庫:java.util.concurrent。我和Gilad Bracha一起,有幸帶領團隊設計了最新的語言特性。我還有幸參加了設計和開發并發類庫的團隊,這個團隊由Doug Lea領導。
Java平臺中另一個大的變化在于廣泛采用了現代的IDE(Integrated Development Envi-ronment),例如Eclipse、IntelliJ IDEA和NetBeans,以及靜態分析工具的IDE,如FindBugs。雖然我還未參與這部分工作,但已經從中受益匪淺,并且很清楚它們對Java開發體驗所帶來的影響。
2004年,我離開Sun公司到了Google公司工作,但在過去的4年中,我仍然繼續參與Java平臺的開發,在Google公司和JCP(Java Community Process)的大力幫助下,繼續并發和集合API的開發。我還有幸利用Java平臺去開發供Google內部使用的類庫。現在我了解了作為一名用戶的感受。
我在2001年編寫第1版的時候,主要目的是與讀者分享我的經驗,便于讓大家避免我所走過的彎路,使大家更容易成功。新版仍然大量采用來自Java平臺類庫的真實范例。
第1版所帶來的反應遠遠超出了我最大的預期。我在收集所有新的資料以使本書保持最新時,盡可能地保持了資料的真實。毫無疑問,本書的篇幅肯定會增加,從57個條目發展到了78個。我不僅增加了23個條目,并且修改了原來的所有資料,并刪去了一些已經過時的條目。在附錄中,你可以看到本書中的內容與第1版的內容的對照情況。
在第1版的前言中我說過:Java程序設計語言和它的類庫非常有益于代碼質量與效率的提高,并且使得用Java進行編碼成為一種樂趣。Java 5和Java 6發行版中的變化是好事,這也使Java平臺日趨完善。現在這個平臺比2001年的要大得多,也復雜得多,但是一旦掌握了使用新特性的模式和習慣用法,它們就會使你的程序變得更完美,使你的工作變得更輕松。我希望第2版能夠體現出我對Java平臺持續的熱情,并將這種熱情傳遞給你,幫助你更加高效和愉快地使用Java平臺及其新的特性。
Joshua Bloch
San Jose, California
2008年4月
第1版前言
1996年,我打點行囊,西行來到了當時的JavaSoft,因為我很清楚那里將會出現奇跡。在這5年間,我是Java平臺庫的架構師。我設計、實現和維護過許多類庫,同時也擔任其他一些庫的技術顧問。隨著Java平臺的成熟和壯大,主持這些類庫的設計工作是一個人一生中難得的機會。毫不夸張地說,我有幸與一些當代最杰出的軟件工程師一起工作。在這個過程中,我學到了許多關于Java程序設計語言的知識——它能夠做什么,不能夠做什么,以及如何最有效地使用這門語言及其類庫。
本書是我的一次嘗試,希望與你分享我的經驗,你可以因此而吸取我的經驗,避免重復我的失敗。本書中我借用了Scott Meyers的《Effective C++》一書的格式,該書中包含50個條目,每個條目給出一條用于改進程序和設計的規則。我覺得這種格式非常有效,希望你也有這樣的感覺。
在許多例子中,我冒昧地使用了Java平臺庫中的真實例子來說明相應的條目。在介紹那些做得不是很完美的工作時,我盡量使用我自己編寫的代碼,但是偶爾我也會使用其他同事的代碼。盡管我盡力做得更好一點,但是如果我真的冒犯了他人,我先在這里致以最誠摯的歉意。引用反面例子是出于協作的精神,而不是要羞辱例子中的做法,我希望大家都能夠從我們過去的錯誤經歷中得到啟發。
盡管本書并不只是針對可重用組件開發人員的,但是過去20多年來我編寫此類組件的經歷一定會影響這本書。我很自然地會按照可導出API(Application Programming Interface)的方式來思考問題,而且我建議你也這樣做。即使你并沒有開發可重用的組件,這樣的思考方法也將有助于你提升軟件的質量。進一步來說,毫無意識地編寫可重用組件的情形并不少見:你編寫了一些很有用的代碼,然后在同伴之間共享,不久之后你就有了很多用戶。這時候,你就不能隨心所欲地改變API了,并且如果你剛開始編寫軟件的時候在設計API上付出了較多的努力,那么這時你就會非常慶幸了。
我把焦點放在API的設計上,這對于那些熱衷于新興的輕量級軟件開發方法學(比如Extreme Programming,即“極限編程”,簡稱XP)的讀者來說,也許會顯得有點不太自然。這些方法學強調編寫最簡單的、能夠工作的程序。如果你正在使用此類的某種程序設計方法,那么你會發現,把焦點放在API設計上對于“重構”(refactoring)過程是多么有益。重構的基本目標是改進系統結構,以及避免代碼重復。如果系統的組件沒有設計良好的API,要達到這樣的目標則是不可能的。
沒有一門語言是完美的,但是有些語言非常優秀。我認為Java程序設計語言及其類庫非常有益于提高代碼質量和工作效率,并使得編碼工作成為一種樂趣。我希望本書能夠抓住我的熱情并傳遞給你,幫助你更有效地利用Java語言,使工作變得更加愉快。
Joshua Bloch
Cupertino, California
2001年4月 |
內容簡介:本書是Jolt獲獎作品的全新升級版,針對Java 7、8、9全面更新,是Java程序員的必備參考書。
全書共12章,90條。第1章為引言;第2章闡述何時以及如何創建和避免創建對象,如何確保對象能夠適時地銷毀,以及如何管理對象銷毀之前必須進行的各種清除動作;第3章闡述所有對象都通用的方法,如equals、hashCode、toString、clone和finalize以及Comparable.compareTo方法等;第4章闡述作為Java語言的核心以及Java語言的基本抽象單元(類和接口)在使用上的一些指導原則,以設計出更加有用、健壯和靈活的類與接口;第5章和第6章分別闡述在Java 1.5發行版本中新增加的泛型、枚舉和注解的最佳實踐,教你如何最大限度地享有這些優勢;第7章討論在Java 8中新增的函數接口、Lambda、方法引用,和為處理數據元素的序列提供類庫級別支持的Stream API;第8章討論方法設計的幾個方面:如何處理參數和返回值,如何設計方法簽名,如何為方法編寫文檔,從而使方法設計在可用性、健壯性和靈活性上有進一步的提升;第9章主要討論Java語言的具體細節,包括局部變量的處理、控制結構、類庫的使用、各種數據類型的用法、反射機制和本地方法的用法,以及優化和命名慣例;第10章闡述如何充分發揮異常的優點來提高程序的可讀性、可靠性和可維護性,以及減少異常使用不當所帶來的負面影響,并提供了一些關于有效使用異常的指導原則;第11章闡述寫出清晰、正確、文檔組織良好的并發程序;第12章講解序列化方面的技術,其中包括序列化代理模式,它可以幫助你避免對象序列化的許多缺陷。
本書第2版是在Java 6發行之后不久出版的,此后Java又發生了巨大的變化。這本Jolt獲獎作品現在已經針對Java 7、8、9進行了全面的更新,充分展示了新的Java編程語言及其類庫特性。當前的Java編程語言支持多種范型,這使得Java程序員迫切需要具體的實踐建議,而本書正是為此而生的。
與本書前兩版一樣,書中每一章都包含幾個“條目”,每個條目都以簡潔的形式呈現,自成獨立的短文。它們提出了具體的建議,揭示了Java平臺的精妙之處,并更新了之前的代碼范例。每個條目的綜合描述和解釋都闡明了應該怎么做,不應該怎么做,以及為什么。
本書的內容涵蓋了Java 7、8和9中新增的語言及類庫特性,包括在其面向對象根部添加的函數編程構造。書中增加了許多新的條目,如其中有一章是專門講解Lambda表達式和Stream的。
本書新增內容包括:
函數接口、Lambda表達式、方法引用,以及Stream
接口中的缺省方法和靜態方法
類型參考,包括泛型的Diamond操作符
@SafeVarargs注解
try-with-resources語句
新增的類庫特性,如Optional接口、java.time包,以及集合的便利工廠方法 |
目錄:推薦序 譯者序 前言 致謝 第1章 引言 1 第2章 創建和銷毀對象 4 第1條:用靜態工廠方法代替構造器 4 第2條:遇到多個構造器參數時要考慮使用構建器 8 第3條:用私有構造器或者枚舉類型強化Singleton屬性 13 第4條:通過私有構造器強化不可實例化的能力 15 第5條:優先考慮依賴注入來引用資源 16 第6條:避免創建不必要的對象 18 第7條:消除過期的對象引用 20 第8條:避免使用終結方法和清除方法 23 第9條:try-with-resources優先于try-f?inally 27 第3章 對于所有對象都通用的方法 30 第10條:覆蓋equals時請遵守通用約定 30 第11條:覆蓋equals時總要覆蓋hashCode 40 第12條:始終要覆蓋toString 44 第13條:謹慎地覆蓋clone 46 第14條:考慮實現Comparable接口 53 第4章 類和接口 59 第15條:使類和成員的可訪問性最小化 59 第16條:要在公有類而非公有域中使用訪問方法 62 第17條:使可變性最小化 64 第18條:復合優先于繼承 70 第19條:要么設計繼承并提供文檔說明,要么禁止繼承 75 第20條:接口優于抽象類 79 第21條:為后代設計接口 83 第22條:接口只用于定義類型 85 第23條:類層次優于標簽類 86 第24條:靜態成員類優于非靜態成員類 88 第25條:限制源文件為單個頂級類 91 第5章 泛型 93 第26條:請不要使用原生態類型 93 第27條:消除非受檢的警告 97 第28條:列表優于數組 99 第29條:優先考慮泛型 102 第30條:優先考慮泛型方法 106 第31條:利用有限制通配符來提升API的靈活性 109 第32條:謹慎并用泛型和可變參數 114 第33條:優先考慮類型安全的異構容器 118 第6章 枚舉和注解 123 第34條:用enum代替int常量 123 第35條:用實例域代替序數 131 第36條:用EnumSet代替位域 132 第37條:用EnumMap代替序數索引 134 第38條:用接口模擬可擴展的枚舉 138 第39條:注解優先于命名模式 140 第40條:堅持使用Override注解 147 第41條:用標記接口定義類型 149 第7章 Lambda和Stream 151 第42條:Lambda優先于匿名類 151 第43條:方法引用優先于Lambda 154 第44條:堅持使用標準的函數接口 156 第45條:謹慎使用Stream 159 第46條:優先選擇Stream中無副作用的函數 164 第47條:Stream要優先用Collection作為返回類型 168 第48條:謹慎使用Stream并行 172 第8章 方法 176 第49條:檢查參數的有效性 176 第50條:必要時進行保護性拷貝 179 第51條:謹慎設計方法簽名 182 第52條:慎用重載 184 第53條:慎用可變參數 189 第54條:返回零長度的數組或者集合,而不是null 190 第55條:謹慎返回optinal 192 第56條:為所有導出的API元素編寫文檔注釋 196 第9章 通用編程 202 第57條:將局部變量的作用域最小化 202 第58條:for-each循環優先于傳統的for循環 204 第59條:了解和使用類庫 207 第60條:如果需要精確的答案,請避免使用f?loat和double 209 第61條:基本類型優先于裝箱基本類型 211 第62條:如果其他類型更適合,則盡量避免使用字符串 213 第63條:了解字符串連接的性能 215 第64條:通過接口引用對象 216 第65條:接口優先于反射機制 218 第66條:謹慎地使用本地方法 220 第67條:謹慎地進行優化 221 第68條:遵守普遍接受的命名慣例 223 第10章 異常 227 第69條:只針對異常的情況才使用異常 227 第70條:對可恢復的情況使用受檢異常,對編程錯誤使用運行時異常 229 第71條:避免不必要地使用受檢異常 231 第72條:優先使用標準的異常 232 第73條:拋出與抽象對應的異常 234 第74條:每個方法拋出的所有異常都要建立文檔 235 第75條:在細節消息中包含失敗-捕獲信息 237 第76條:努力使失敗保持原子性 238 第77條:不要忽略異常 239 第11章 并發 241 第78條:同步訪問共享的可變數據 241 第79條:避免過度同步 245 第80條:executor、task和stream優先于線程 250 第81條:并發工具優先于wait和notify 251 第82條:線程安全性的文檔化 256 第83條:慎用延遲初始化 258 第84條:不要依賴于線程調度器 261 第12章 序列化 263 第85條:其他方法優先于Java序列化 263 第86條:謹慎地實現Serializable接口 266 第87條:考慮使用自定義的序列化形式 269 第88條:保護性地編寫readObject方法 274 第89條:對于實例控制,枚舉類型優先于readResolve 279 第90條:考慮用序列化代理代替序列化實例 282 附錄 與第2版中條目的對應關系 286 參考文獻 289 |
序: |