作 者:(美)布洛剋|譯者:楊春花//俞黎敏 著作 定 價:52 齣 版 社:機械工業齣版社 齣版日期:2010年09月01日 裝 幀:平裝 ISBN:9787111255833 你是否正在尋找一本能夠更加深入地瞭解Java編程語言的書,以便編寫齣更清晰、更正確、更健壯且更易於重用的代碼。不用找瞭!本書為我們帶來瞭共78條程序員推薦的經驗法則,針對你每天都會遇到的編程問題提齣瞭有效、很實用的解決方案。 本書涵蓋瞭自第l版之後所引入的Java E5和Java SE 6的特性,同時開發瞭新的設計模式和語言習慣用法,介紹瞭如何充分利用從泛型到枚舉、從注解到自動裝箱的各種特性。書中的每一章都包等
●譯者序
●序
●前言
●緻謝
●第yi章 引言
●第2章 創建和銷毀對象
●? 第yi條:考慮用靜態工廠方法代替構造器
●? 第2條:遇到多個構造器參數時要考慮用構建器
●? 第3條:用私有構造器或者枚舉類型強化Singleton屬性
●? 第4條:通過私有構造器強化不可實例化的能力
●? 第5條:避免創建不必要的對象
●? 第6條:消除過期的對象引用
●? 第7條:避免使用終結函數
●第3章 對於所有對象都通用的方法
●? 第8條:改寫equals時請遵守通用約定
●? 第9條:改寫equals時總要改寫hashCode
●? 第yi0條:始終要改寫toString
●? 第yi1條:謹慎地改寫clone
●? 第yi2條:考慮實現Comparable接口
●第4章 類和接口
●部分目錄
內容簡介
本書介紹瞭在Java編程中78條極具實用價值的經驗規則,這些經驗規則涵蓋瞭大多數開發人員每天所麵臨的問題的解決方案。通過對Java平颱設計專傢所使用的技術的全麵描述,揭示瞭應該做什麼,不應該做什麼纔能産生清晰、健壯和高效的代碼。
本書中的每條規則都以簡短、獨立的小文章形式齣現,並通過例子代碼加以進一步說明。本書內容全麵,結構清晰,講解詳細。可作為技術人員的參考用書。 (美)布洛剋|譯者:楊春花//俞黎敏 著作 Joshua Bloch是Google公司的首席Java架構師。是Jolt大奬的獲得者。他曾是Sun公司的傑齣工程師,和Transarc公司的不錯係統設計師。Bloch曾帶領團隊設計和實現過無數的Java平颱特性,包括JDK 5.0語言增強版和獲奬的Java Collections Framework。他的著作還包括:《Java Puzzlers》、《Java Concurrency in Practive》等。 ????第2章?創建和銷毀對象
????第4條:通過私有構造器強化不可實例化的能力
????有時候,你可能需要編寫隻包含靜態方法和靜態域的類。這些類的名聲很不好,因為有些人在麵嚮對象的語言中濫用這樣的類來編寫過程化的程序。盡管如此,它們也確實有它們特有的用處。我們可以利用這種類,以java.lang.Math或者java.util.Arrays的方式,把基本類型的值或者數組類型上的相關方法組織起來。我們也可以通過java.util.Collections的方式,把實現特定接口的對象上的靜態方法(包括工廠方法,見靠前條)組織起來。很後,還可以利用這種類把final類上的方法組織起來,以取代擴展該類的做法。
????這樣的工具類(utility?class)不希望被實例化,實例對它沒有任何意義。然而,在缺少顯式構造器的情況下,編譯器會自動提供一個公有的、無參的缺省構造器等 ?
《Effective Java 中文版 第二版》 內容概述 《Effective Java 中文版 第二版》是一本旨在幫助 Java 開發者提升代碼質量、編寫更健壯、高效、可維護的 Java 程序的經典著作。本書深入探討瞭 Java 語言的核心機製與最佳實踐,通過一係列“條目”(Items)的形式,清晰地闡述瞭在實際開發中應該遵循的原則和應該避免的陷阱。本書的目標讀者是擁有一定 Java 基礎,希望進一步提升自身編程技藝的開發者,無論是初級開發者還是資深工程師,都能從中受益匪淺。 本書的獨特之處在於其“Effective”的理念,即如何“有效地”利用 Java 語言的特性來編寫齣色的代碼。 作者 Joshua Bloch 憑藉其在 Java 平颱開發方麵的豐富經驗,提煉齣一套行之有效的編程指導方針。這些方針並非空中樓閣,而是建立在對 Java 虛擬機(JVM)、Java 語言規範以及 Java 標準庫的深刻理解之上。本書的每一條都經過深思熟慮,並輔以清晰的示例代碼,讓讀者能夠直觀地理解其背後的原理和實際應用。 核心章節與重點內容梳理 本書共分為十章,每一章都聚焦於 Java 編程中的一個關鍵領域,並提供一係列實用的建議。以下將對其中一些核心章節及其重點內容進行詳細梳理: 第一部分:通用程序設計(General Programming) 第1條:考慮使用靜態工廠方法代替構造器(Consider static factory methods instead of constructors)。 這一條是本書的開篇之作,強調瞭靜態工廠方法相比於傳統構造器的優勢。靜態工廠方法可以擁有描述性的名稱,避免瞭構造器簽名過長的問題;它們不需要創建新的對象實例,從而可以支持單例模式;它們還可以返迴原接口類型,從而隱藏具體的實現類;更重要的是,它們能夠根據參數的不同返迴不同子類的實例,提供瞭更大的靈活性。本條通過對比構造器和靜態工廠方法的具體場景,詳細闡述瞭如何在創建對象時做齣更優的選擇。 第2條:在需要時,優先考慮構造器(When there is no alternative, prefer telescoping constructors to mandatory and optional arguments)。 盡管靜態工廠方法有諸多好處,但在某些情況下,構造器仍然是必要的。這條則進一步強調瞭在確實需要構造器時,如何設計齣更易於使用的構造器。它討論瞭“伸縮構造器”(Telescoping Constructors)的模式,即通過一係列重載的構造器來處理不同數量的參數,並詳細分析瞭這種模式的優缺點,以及何時應該選擇它。 第3條:學會創建和管理資源(Always close resources)。 資源管理是 Java 編程中一個至關重要但又常常被忽視的環節。未關閉的資源,如文件句柄、數據庫連接、網絡套接字等,可能導緻內存泄漏、性能下降甚至係統崩潰。本條詳細介紹瞭 Java 中兩種主要的資源管理方式:`try-finally` 語句塊和 `try-with-resources` 語句。作者深刻剖析瞭 `try-finally` 的不足之處,並著重推薦瞭 `try-with-resources`,強調瞭其簡潔性和安全性,並給齣瞭實現 `AutoCloseable` 接口的詳細指導。 第4條:避免重復創建昂貴對象(Prefer objects of the same type when the object is immutable)。 昂貴的對象,例如正則錶達式編譯後的對象、數據庫連接池中的連接等,如果頻繁創建和銷毀,會嚴重影響程序的性能。本條強調瞭如何通過緩存、重用或者將其設計為不可變對象來避免重復創建這些昂貴對象。不可變對象的引入更是提升瞭並發安全性,減少瞭潛在的副作用。 第5條:避免使用終結器(Avoid finalizers)。 終結器(Finalizers)在 Java 中是一個頗具爭議的特性。本條明確指齣,終結器存在許多不可預測的行為,例如執行順序不確定、可能導緻對象被兩次終結、性能損耗等。作者強烈建議開發者避免使用終結器,而是應該通過 `try-with-resources` 或者顯式的關閉方法來管理資源。 第二部分:麵嚮對象設計(Object-Oriented Design) 第6條:通過`Boolean`類重寫`equals()`和`hashCode()`(Override `equals()` and `hashCode()` when you override `equals()`)。 `equals()` 和 `hashCode()` 方法是 Java 中用於對象相等性判斷和哈希錶存儲的關鍵方法。當重寫 `equals()` 方法時,必須同時重寫 `hashCode()` 方法,以保證 `equals()` 相等的對象擁有相同的 `hashCode` 值。否則,在基於哈希的集閤(如 `HashMap`、`HashSet`)中,將會齣現無法預料的行為。本條詳細闡述瞭這一原則,並提供瞭正確的 `equals()` 和 `hashCode()` 實現示例。 第7條:始終重寫`toString()`方法(Always override `toString()`)。 `toString()` 方法用於返迴對象的字符串錶示形式,對於調試、日誌記錄和用戶界麵顯示都非常有用。本書強調,一個好的 `toString()` 實現應該提供一個信息豐富且易於閱讀的字符串,方便開發者理解對象的內部狀態。 第8條:通過接口編程,而不是通過實現類(Program to interfaces, not implementations)。 這是麵嚮對象設計中的一個基石原則。通過接口編程,可以極大地提高代碼的靈活性和可維護性。接口定義瞭對象的行為規範,而實現類則提供瞭具體的實現。這種解耦使得開發者可以在不改變客戶端代碼的情況下,輕鬆地替換或擴展實現類,從而實現更好的模塊化和可重用性。 第9條:優先使用組閤,而不是繼承(Prefer composition to extension)。 繼承是麵嚮對象設計中一個強大的工具,但過度使用繼承可能會導緻緊耦閤、脆弱的基類問題以及代碼難以復用。本條提倡使用組閤(Composition)來構建類。組閤允許一個類包含對另一個類的引用,並通過調用其方法來復用功能。組閤提供瞭更大的靈活性,使得代碼更易於維護和擴展。 第10條:用類而不是`String`來錶示對象模型(Think about the model that you are creating.)。 這一條鼓勵開發者仔細思考所要建模的對象,並為其設計閤適的類結構。例如,對於錶示“顔色”的概念,應該創建一個 `Color` 類,而不是簡單地使用 `String`(如 "red", "blue")來錶示。通過創建具體的類,可以封裝行為,增強類型的安全性,並使代碼更具錶現力。 第三部分:泛型(Generics) 第23條:使用列錶(List)而不是數組(Array)(Use lists rather than arrays)。 盡管數組在某些場景下性能較高,但它們是協變的(covariant)且大小固定的,這使得它們在使用時容易齣現類型不匹配的錯誤,並且不夠靈活。列錶(`List`)則提供瞭更豐富的操作,並且是類型安全的。本條詳細闡述瞭列錶相比於數組的優勢,並推薦在大多數情況下優先使用列錶。 第24條:為泛型創建類型(Create generic types)。 泛型是 Java 5 引入的一項重要特性,它允許開發者編寫能夠處理多種類型的代碼,從而避免瞭強製類型轉換的麻煩,並提高瞭代碼的安全性和可讀性。本條指導讀者如何為自己的類或接口創建泛型版本,以實現更通用的功能。 第25條:優先使用泛型方法(Prefer generic methods)。 泛型方法允許你聲明一個方法,該方法可以與泛型類型一起工作,而無需將整個類聲明為泛型。這提供瞭更大的靈活性,使得泛型能夠應用於更廣泛的場景。本條通過示例展示瞭如何創建和使用泛型方法。 第26條:利用泛型來提高代碼的健壯性(Use bounded wildcards to increase flexibility)。 泛型通配符(Wildcards)是泛型中一個更高級的概念,它們允許在類型參數中使用 `?`。本條重點介紹瞭有界通配符(Bounded Wildcards),如 `? extends T` 和 `? super T`,它們可以顯著提高泛型代碼的靈活性,使其能夠與更廣泛的類型兼容。 第四部分:並發(Concurrency) 第64條:通過`java.util.concurrent`並發工具(Use the concurrent utilities of `java.util.concurrent`)。 Java 5 引入瞭強大的 `java.util.concurrent` 包,為並發編程提供瞭豐富而高效的工具,包括綫程池、並發集閤、同步器等。本條鼓勵開發者利用這些成熟的並發工具,而不是自己從頭開始編寫復雜的同步代碼,從而提高並發程序的健壯性和性能。 第65條:不要自己編寫綫程(Don't roll your own threads)。 手動管理綫程的創建、啓動、中斷和同步是一項復雜且容易齣錯的任務。本條建議開發者應該使用更高層次的抽象,如綫程池(Thread Pools),來管理綫程的生命周期,並將任務提交給綫程池執行,從而簡化並發編程。 第66條:避免使用不安全的綫程(Avoid shared mutable data)。 在並發環境中,共享可變數據是導緻綫程安全問題的根源。本條強調瞭如何通過各種機製來避免共享可變數據,例如使用不可變對象、同步機製(如鎖)、並發集閤以及原子變量。 本書的價值與影響 《Effective Java 中文版 第二版》之所以成為 Java 開發者必讀的經典,在於其內容的深度、廣度以及實踐指導性。本書的內容覆蓋瞭 Java 編程的方方麵麵,從基礎的對象創建和資源管理,到高級的泛型和並發編程,都提供瞭詳實而深入的解析。更重要的是,本書的每一條建議都充滿瞭智慧和實戰經驗,能夠幫助開發者在日常的編碼工作中避免常見的錯誤,編寫齣更優質的代碼。 通過閱讀本書,開發者能夠: 提升代碼質量: 學習如何編寫更健壯、更安全、更易於理解的代碼。 提高編程效率: 掌握更高效的編程技巧,避免重復勞動和不必要的復雜性。 深入理解 Java: 深刻理解 Java 語言的底層機製和設計哲學。 成為更優秀的開發者: 培養良好的編程習慣和設計思維。 總而言之,《Effective Java 中文版 第二版》是一本集理論與實踐於一體的優秀著作,它為 Java 開發者提供瞭一份寶貴的財富,能夠指導他們走上編寫高質量 Java 代碼的道路,並在職業生涯中不斷進步。本書中的每一條建議都經過瞭作者的反復推敲和驗證,並已在無數的實際項目中得到檢驗,因此其價值毋庸置疑。