Effective Java 第三版全文翻譯,純屬個人業餘翻譯

effective-java-third-edition

開源地址:https://gitee.com/lin-mt/effective-java-third-edition

介紹

Effective Java 第三版全文翻譯,純屬個人業餘翻譯,不合理的地方,望指正,感激不盡!

如果對你有幫助的話,給個 Star 支持一下,謝謝


Effective Java 第三版全文翻譯,純屬個人業餘翻譯

本項目僅為個人學習交流使用,切勿作為商業用途,若將此項目作為商業用途,後果自負,與本項目無關。

聯繫郵箱:[email protected]

目錄


推薦序

前言

致謝

第一章 引言

第二章 創建和銷燬對象

  本章涉及創建和銷燬對象,包括何時以及如何創建它們,何時以及如何避免創建它們,如何確保它們被及時銷燬,以及如何管理在銷燬之前必須進行的清理操作。

<code>第 1 項:考慮靜態工廠方法而不是構造函數第 2 項:當面臨多個參數的構造器時考慮使用構建器第 3 項:用私有構造器或者枚舉類型強化 Singleton 屬性第 4 項:通過私有構造器強化不可實例化的能力第 5 項:優先考慮依賴注入來引用資源第 6 項:避免創建不必要的對象第 7 項:消除過期的對象引用第 8 項:避免使用終結方法和清除方法第 9 項:try-with-resources 優先於 try-finally/<code> 

第三章 對於所有對象都通用的方法

  儘管 Object 是一個具體類,但是設計它主要是為了擴展。它所有的非 final 方法(equals、hashCode、toString、clone 和 finalize)都有明確的通用約定(general contracts),因為它們被設計成是要被重寫(override)的。任何一個類,它在覆蓋這些方法的時候,都有責任遵守這些通用約定;如果做不到這一點,其他依賴於這些約定的類(例如 HashMap 和 HashSet)就無法結合該類一起正常運作。

  本章將講述何時以及如何覆蓋這些非 final 的 Object 方法。本章不再討論 finalize 方法,因為第 7 項已經討論過這個方法了。而 Comparable.compareTo 雖然不是 Object 方法,但是本章也對它進行討論,因為它具有類似的特徵。

<code>第 10 項:覆蓋 equals 時請遵守通用約定第 11 項:當重寫 equals 方法時總要重寫 hashCode 方法第 12 項:始終重寫 toString 方法第 13 項:謹慎地重寫 clone 方法第 14 項:考慮實現 Comparable 接口/<code>

第四章 類和接口

  類和接口是 Java 程序設計語言的核心,他們也是 Java 語言的基本抽象單元。Java 語言提供了許多強大的基本元素,供程序猿來設計類和接口。本章包含的一些指南可以幫助你充分利用這些元素,以便讓你編寫的類和接口可用、健壯且靈活。

<code>第 15 項:使類和成員的可訪問性最小化第 16 項:要在公有類而非公有域中使用訪問方法第 17 項:使可變性最小化第 18 項:複合優先於繼承第 19 項:要麼設計繼承並提供文檔說明,要麼禁止繼承第 20 項:接口優於抽象類第 21 項:為後代設計接口第 22 項:接口只用於定義類型第 23 項:類層次優於標籤類第 24 項:靜態成員類優於非靜態成員類第 25 項:限制源文件為單個頂級類/<code>

第五章 泛型

  Java 1.5 發行版本中增加了泛型(Generic)。在沒有泛型之前,從集合中讀取到的每一個對象都必須進行轉換。如果有人不小心插入了類型錯誤的對象,在運行時進行轉換處理就會出錯。有個泛型,可以告訴編譯器每個集合中接收哪些對象類型。編譯器自動地為你的插入進行轉化,並在編譯時告知是否插入了類型錯誤的對象。這樣可以使程序既更加安全,也更加清楚,但是這些好處(不僅僅針對集合)是需要付出代價的。本章將告訴您如何最大化利益並最大限度地減少併發症【使用泛型帶來的壞處】(complications)。

<code>第 26 項:請不要使用原始類型第 27 項:消除非受檢的警告第 28 項:列表優於數組第 29 項:優先考慮泛型第 30 項:優先考慮泛型方法第 31 項:利用有限制通配符來提升 API 的靈活性第 32 項:謹慎並用泛型和可變參數第 33 項:優先考慮類型安全的異構容器/<code> 

第六章 枚舉和註解

  Java 支持兩種特殊用途的引用類型:一種稱為枚舉(enum type)類型,以及一種稱為註解類型(annotation type)的接口。本章討論使用這些類型系列的最佳實踐。

<code>第 34 項:用 enum 代替 int 常量第 35 項:用實例域代替序數第 36 項:用 EnumSet 代替位域第 37 項:用 EnumMap 代替序數索引第 38 項:用接口模擬可擴展的枚舉第 39 項:註解優先於命名模式第 40 項:堅持使用 Override 註解第 41 項:用標記接口定義類型/<code>

第七章 Lambda 和 Stream

  在 Java 8 中,添加了函數接口,lambda 和方法引用,以便更容易地創建函數對象。在這些語法(language)更改的同時添加進了流 API,以便為處理數據元素序列提供支持的庫。在本章中,我們將討論如何充分利用這些工具。

<code>第 42 項:Lambda 優先於匿名類第 43 項:方法引用優先於 Lambda第 44 項:堅持使用標準的函數接口第 45 項:謹慎使用 Stream第 46 項:優先選擇 Stream 中無副作用的函數第 47 項:Stream 要優先用 Collection 作為返回類型第 48 項:謹慎使用 Stream 並行/<code>

第八章 方法

  本章討論了方法設計的幾個方面:如何處理參數和返回值,如何設計方法簽名以及如何為方法編寫文檔。本章中的大部分內容適用於構造函數和方法。與第 4 章一樣,本章重點介紹可用性,健壯性和靈活性。

<code>第 49 項:檢查參數的有效性第 50 項:必要時進行保護性拷貝第 51 項:謹慎設計方法簽名第 52 項:慎用重載第 53 項:慎用可變參數第 54 項:返回零長度的數組或者集合,而不是 null第 55 項:謹慎返回 optinal第 56 項:為所有導出的 API 元素編寫文檔註釋/<code>

第九章 通用編程

  本章主要討論 Java 語言的具體細節,討論了局部變量、控制結構、類庫、數據類型,以及兩種不是由語言本身提供的機制(reflection 和 native method,反射機制和本地方法)。最後討論了優化和命名慣例。

<code>第 57 項:將局部變量的作用域最小化第 58 項:for-each 循環優先於傳統的 for 循環第 59 項:瞭解和使用類庫第 60 項:如果需要精確的答案,請避免使用 float 和 double第 61 項:基本類型優先於裝箱基本類型第 62 項:如果其他類型更適合,則儘量避免使用字符串第 63 項:瞭解字符串連接的性能第 64 項:通過接口引用對象第 65 項:接口優先於反射機制第 66 項:謹慎地使用本地方法第 67 項:謹慎地進行優化第 68 項:遵守普遍接受的命名慣例/<code>

第十章 異常

  在最通常情況下,異常可以提高程序的可讀性,可靠性和可維護性。如果使用不當,可能會產生相反的效果。本章提供有效使用異常的指南。

<code>第 69 項:只針對異常的情況才使用異常第 70 項:對可恢復的情況使用受檢異常,對編程錯誤使用運行時異常第 71 項:避免不必要地使用受檢異常第 72 項:優先使用標準的異常第 73 項:拋出與抽象對應的異常第 74 項:每個方法拋出的所有異常都要建立文檔第 75 項:在細節消息中包含失敗-捕獲信息第 76 項:努力使失敗保持原子性第 77 項:不要忽略異常/<code>

第十一章 併發

  線程(THREADS)機制允許同時進行多個活動。併發編程要比單線程編程要困難得多,因為有很多東西可能出錯,也很難重現失敗。你無法避免併發。它本來就存在 Java 平臺中了,如果你要從多核處理器中獲得更好的性能,併發也是一個必要條件,這些現在都是十分普遍的了。本章闡述的建議可以幫助你編寫出清晰、正確、文檔組織良好的併發程序。

<code>第 78 項:同步訪問共享的可變數據第 79 項:避免過度同步第 80 項:executor、task 和 stream 優先於線程第 81 項:併發工具優先於 wait 和 notify第 82 項:線程安全性的文檔化第 83 項:慎用延遲初始化第 84 項:不要依賴於線程調度器/<code>

第十二章 序列化

  本章關注對象序列化(object serialization) ,它是一個 Java 的框架,用來將對象編碼為字節流(序列化(serializing)),並從其編碼中重構對象(反序列化(deserializing))。一旦對象被序列化,其編碼可以從一個 VM 發送到另一個 VM 或存儲在磁盤上以便以後反序列化。本章重點介紹如何將序列化的危險最小化。

<code>第 85 項:其他方法優先於 Java 序列化第 86 項:謹慎地實現 Serializable 接口第 87 項:考慮使用自定義的序列化形式第 88 項:保護性地編寫 readObject 方法第 89 項:對於實例控制,枚舉類型優先於 readResolve第 90 項:考慮用序列化代理代替序列化實例/<code>

附錄 與第 2 版中項目的對應關係

參考文獻


分享到:


相關文章: