出版時(shí)間:2009-1 出版社:機(jī)械工業(yè) 作者:Joshua Bloch 頁(yè)數(shù):287 譯者:俞黎敏
Tag標(biāo)簽:無(wú)
前言
如果有一個(gè)同事這樣對(duì)你說(shuō),“我的配偶今天晚上在家里制造了一頓不同尋常的晚餐,你愿意來(lái)參加嗎?”(Spouse of me this night today manufactures the unusual meal in a home.You will join?)這時(shí)候你腦子里可能會(huì)浮現(xiàn)起三件事情:第一,滿腦子的疑惑;第二,英語(yǔ)肯定不是這位同事的母語(yǔ);第三,同事是在邀請(qǐng)你參加他的家庭晚宴。如果你曾經(jīng)學(xué)習(xí)過(guò)第二種語(yǔ)言,并且嘗試過(guò)在課堂之外使用這種語(yǔ)言,你就該知道有三件事情是必須掌握的:這門(mén)語(yǔ)言的結(jié)構(gòu)如何(語(yǔ)法),如何命名你想談?wù)摰氖挛?詞匯),以及如何以慣用和高效的方式來(lái)表達(dá)日常的事物(用法)。在課堂上大多只涉及前面兩點(diǎn),當(dāng)你使出渾身解數(shù)想讓對(duì)方明白你的意思時(shí),常常會(huì)發(fā)現(xiàn)當(dāng)?shù)厝藢?duì)你的表述忍俊不禁。程序設(shè)計(jì)語(yǔ)言也是如此。你需要理解語(yǔ)言的核心:它是面向算法的,還是面向函數(shù)的,或者是面向?qū)ο蟮?你需要知道詞匯表:標(biāo)準(zhǔn)類(lèi)庫(kù)提供了哪些數(shù)據(jù)結(jié)構(gòu)、操作和功能(Facility)?你還需要熟悉如何用習(xí)慣和高效的方式來(lái)構(gòu)建代碼。關(guān)于程序設(shè)計(jì)語(yǔ)言的書(shū)籍通常只是涉及前面兩點(diǎn),或者只是蜻蜓點(diǎn)水般地介紹一下用法。也許是因?yàn)榍懊鎯牲c(diǎn)比較容易編寫(xiě)。語(yǔ)法和詞匯是語(yǔ)言本身固有的特性,但是,用法則反映了使用這門(mén)語(yǔ)言的群體的特征。例如,Java程序設(shè)計(jì)語(yǔ)言是一門(mén)支持單繼承的面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言,在每個(gè)方法的內(nèi)部,它也支持命令式的(面向語(yǔ)句的,statement-Oriented)編碼風(fēng)格。Java類(lèi)庫(kù)提供了對(duì)圖形顯示、網(wǎng)絡(luò)、分布式計(jì)算和安全性的支持。但是,·如何把這門(mén)語(yǔ)言以最佳的方式運(yùn)用到實(shí)踐中呢?還有一點(diǎn):程序與口語(yǔ)中的句子以及大多數(shù)書(shū)籍和雜志都不同,它會(huì)隨著時(shí)間的推移而發(fā)生變化。僅僅編寫(xiě)出能夠有效地工作并且能夠被別人理解的代碼往往是不夠的,我們還必須把代碼組織成易于修改的形式。針對(duì)某個(gè)任務(wù)可能會(huì)有10種不同的編碼方法,而在這10種方法中,有7種方法是笨拙的、低效的或者是難以理解的。而在剩下的3種編碼方法中,哪一種會(huì)是最接近該任務(wù)的下一年度發(fā)行版本的代碼呢?目前有大量的書(shū)籍可以供你學(xué)習(xí)Java程序設(shè)計(jì)語(yǔ)言的語(yǔ)法,包括《he Java Programming L,anguage》[Arnold05](作者Amold、Gosling和Holmes),以及《The Java Language Specification》[JLS](作者Gosling、Joy和Bracha)。同樣,與Java程序設(shè)計(jì)語(yǔ)言相關(guān)的類(lèi)庫(kù)租API的書(shū)籍也不少。本書(shū)解決了你的第三種需求:習(xí)慣和高效的用法。作者Joshua Bloch在Sun公司多年來(lái)一直從事Java語(yǔ)言的擴(kuò)展、實(shí)現(xiàn)和使用的工作;他還大量地閱讀了其他人的代碼,包括我的代碼。他在本書(shū)中提出了許多很好的建議,他系統(tǒng)地把這些建議組織起來(lái),旨在告訴讀者如何更好地構(gòu)造代碼以便它們能工作得更好,也便于其他人能夠理解這些代碼,便于將來(lái)對(duì)代碼進(jìn)行修改和改善的時(shí)候不至于那么頭疼。甚至,你的程序也會(huì)因此而變得更加令人愉悅、更加優(yōu)美和雅致。
內(nèi)容概要
本書(shū)介紹了在Java編程中78條極具實(shí)用價(jià)值的經(jīng)驗(yàn)規(guī)則,這些經(jīng)驗(yàn)規(guī)則涵蓋了大多數(shù)開(kāi)發(fā)人員每天所面臨的問(wèn)題的解決方案。通過(guò)對(duì)Java平臺(tái)設(shè)計(jì)專(zhuān)家所使用的技術(shù)的全面描述,揭示了應(yīng)該做什么,不應(yīng)該做什么才能產(chǎn)生清晰、健壯和高效的代碼。 本書(shū)中的每條規(guī)則都以簡(jiǎn)短、獨(dú)立的小文章形式出現(xiàn),并通過(guò)例子代碼加以進(jìn)一步說(shuō)明。本書(shū)內(nèi)容全面,結(jié)構(gòu)清晰,講解詳細(xì)??勺鳛榧夹g(shù)人員的參考用書(shū)。
作者簡(jiǎn)介
Joshua Bloch是Google公司的首席Java架構(gòu)師。是Jolt大獎(jiǎng)的獲得者。他曾是Sun公司的杰出工程師,和Transarc公司的高級(jí)系統(tǒng)設(shè)計(jì)師。Bloch曾帶領(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。他的著作還包括:《Java Puzzler
書(shū)籍目錄
譯者序序前言致謝第1章 引言第2章 創(chuàng)建和銷(xiāo)毀對(duì)象 第1條:考慮用靜態(tài)工廠方法代替構(gòu)造器 第2條:遇到多個(gè)構(gòu)造器參數(shù)時(shí)要考慮用構(gòu)建器 第3條:用私有構(gòu)造器或者枚舉類(lèi)型強(qiáng)化Singleton屬性 第4條:通過(guò)私有構(gòu)造器強(qiáng)化不可實(shí)例化的能力 第5條:避免創(chuàng)建不必要的對(duì)象 第6條:消除過(guò)期的對(duì)象引用 第7條:避免使用終結(jié)函數(shù)第3章 對(duì)于所有對(duì)象都通用的方法 第8條:改寫(xiě)equals時(shí)請(qǐng)遵守通用約定 第9條:改寫(xiě)equals時(shí)總要改寫(xiě)hashCode 第10條:始終要改寫(xiě)toString 第11條:謹(jǐn)慎地改寫(xiě)clone 第12條:考慮實(shí)現(xiàn)Comparable接口第4章 類(lèi)和接口 第13條:使類(lèi)和成員的可訪問(wèn)性最小化 第14條:在公有類(lèi)中使用訪問(wèn)方法而非公有域 第15條:使非可變性最小化 第16條:復(fù)合優(yōu)先于繼承 第17條:要么為繼承而設(shè)計(jì),并提供文檔說(shuō)明,要么就禁止繼承 第18條:接口優(yōu)于抽象類(lèi) 第19條:接口只用于定義類(lèi)型 第20條:類(lèi)層次優(yōu)于標(biāo)簽類(lèi) 第21條:用函數(shù)對(duì)象表示策略 第22條:優(yōu)先考慮靜態(tài)成員類(lèi)第5章 泛型 第23條:請(qǐng)不要在新代碼中使用原生態(tài)類(lèi)型 第24條:消除非受檢警告 第25條:列表優(yōu)先于數(shù)組 第26條:優(yōu)先考慮泛型 第27條:優(yōu)先考慮泛型方法 第28條:利用有限制通配符來(lái)提升API的靈活性 第29條:優(yōu)先考慮類(lèi)型安全的異構(gòu)容器第6章 枚舉和注解 第30條:用enum代替int常量 第31條:用實(shí)例域代替序數(shù) 第32條:用EnumSet代替位域 第33條:用EnumMap代替序數(shù)索引 第34條:用接口模擬可伸縮的枚舉 第35條:注解優(yōu)先于命名模式 第36條:堅(jiān)持使用Override注解 第37條:用標(biāo)記接口定義類(lèi)型第7章 方法 第38條:檢查參數(shù)的有效性 第39條:必要時(shí)進(jìn)行保護(hù)性拷貝 第40條:謹(jǐn)慎設(shè)計(jì)方法簽名 第41條:慎用重載 第42條:慎用可變參數(shù)(varargs) 第43條:返回零長(zhǎng)度的數(shù)組或者集合,而不是null 第44條:為所有導(dǎo)出的API元素編寫(xiě)文檔注釋第8章 通用程序設(shè)計(jì) 第45條:將局部變量的作用域最小化 第46條:for-each循環(huán)優(yōu)先于傳統(tǒng)的for循環(huán) 第47條:了解和使用類(lèi)庫(kù) 第48條:如果需要精確的答案,請(qǐng)避免使用float和double 第49條:原語(yǔ)類(lèi)型優(yōu)先于裝箱的原語(yǔ)類(lèi)型 第50條:如果其他類(lèi)型更適合,則盡量避免使用字符串 第51條:了解字符串連接的性能 第52條:通過(guò)接口引用對(duì)象 第53條:接口優(yōu)先于反射機(jī)制 第54條:謹(jǐn)慎地使用本地方法 第55條:謹(jǐn)慎地進(jìn)行優(yōu)化 第56條:遵守普遍接受的命名慣例第9章 異常 第57條:只針對(duì)異常的條件才使用異常 第58條:對(duì)可恢復(fù)的條件使用受檢異常,對(duì)編程錯(cuò)誤使用運(yùn)行時(shí)異?!〉?9條:避免不必要地使用受檢的異常 第60條:盡量使用標(biāo)準(zhǔn)的異?!〉?1條:拋出與抽象相對(duì)應(yīng)的異?!〉?2條:每個(gè)方法拋出的所有異常都要有文檔 第63條:在細(xì)節(jié)消息中包含失敗-捕獲信息 第64條:努力使失敗保持原子性 第65條:不要忽略異常第10章 并發(fā) 第66條:同步訪問(wèn)共享的可變數(shù)據(jù) 第67條:避免過(guò)多同步 第68條:executor和task優(yōu)先于線程 第69條:并發(fā)工具優(yōu)先于wait和notify 第70條:線程安全性的文檔化 第71條:慎用延遲初始化 第72條:不要依賴(lài)于線程調(diào)度器 第73條:避免使用線程組第11章 序列化 第74條:謹(jǐn)慎地實(shí)現(xiàn)Serializable 第75條:考慮使用自定義的序列化形式 第76條:保護(hù)性地編寫(xiě)readObject方法 第77條:對(duì)于實(shí)例控制,枚舉類(lèi)型優(yōu)先于readResolve 第78條:考慮用序列化代理代替序列化實(shí)例
章節(jié)摘錄
插圖:第2章 創(chuàng)建和銷(xiāo)毀對(duì)象第4條:通過(guò)私有構(gòu)造器強(qiáng)化不可實(shí)例化的能力有時(shí)候,你可能需要編寫(xiě)只包含靜態(tài)方法和靜態(tài)域的類(lèi)。這些類(lèi)的名聲很不好,因?yàn)橛行┤嗽诿嫦驅(qū)ο蟮恼Z(yǔ)言中濫用這樣的類(lèi)來(lái)編寫(xiě)過(guò)程化的程序。盡管如此,它們也確實(shí)有它們特有的用處。我們可以利用這種類(lèi),以java.1ang.Math或者java.util.Arrays的方式,把基本類(lèi)型的值或者數(shù)組類(lèi)型上的相關(guān)方法組織起來(lái)。我們也可以通過(guò)java.util.Collections的方式,把實(shí)現(xiàn)特定接口的對(duì)象上的靜態(tài)方法(包括工廠方法,見(jiàn)第1條)組織起來(lái)。最后,還可以利用這種類(lèi)把final類(lèi)上的方法組織起來(lái),以取代擴(kuò)展該類(lèi)的做法。這樣的工具類(lèi)(utility class)不希望被實(shí)例化,實(shí)例對(duì)它沒(méi)有任何意義。然而,在缺少顯式構(gòu)造器的情況下,編譯器會(huì)自動(dòng)提供一個(gè)公有的、無(wú)參的缺省構(gòu)造器(default constructor)。對(duì)于用戶(hù)而言,這個(gè)構(gòu)造器與其他的構(gòu)造器沒(méi)有任何區(qū)別。在已發(fā)行的API中常??梢钥吹揭恍┍粺o(wú)意識(shí)地實(shí)例化的類(lèi)。企圖通過(guò)將類(lèi)做成抽象類(lèi)來(lái)強(qiáng)制該類(lèi)不可被實(shí)例化,這是行不通的。該類(lèi)可以被子類(lèi)化,并且該子類(lèi)也可以被實(shí)例化。這樣做甚至?xí)`導(dǎo)用戶(hù),以為這種類(lèi)是專(zhuān)門(mén)為了繼承而設(shè)計(jì)的(見(jiàn)第17條)。然而,有一些簡(jiǎn)單的習(xí)慣用法可以確保類(lèi)不可被實(shí)例化。由于只有當(dāng)類(lèi)不包含顯式的構(gòu)造器時(shí),編譯器才會(huì)生成缺省的構(gòu)造器,因此我們只要讓這個(gè)類(lèi)包含私有構(gòu)造器,它就不能被實(shí)例化了。
媒體關(guān)注與評(píng)論
“我很希望10年前就擁有這本書(shū)。可能有人認(rèn)為我不需要任何Java方面的書(shū)籍,但是我需要這本書(shū)?!薄 狫ava之父 James Gosling
編輯推薦
《Effective Java中文版(第2版)》內(nèi)容全面,結(jié)構(gòu)清晰,講解詳細(xì)。可作為技術(shù)人員的參考用書(shū)。編碼平添樂(lè)趣,程序更加完美,高效成為習(xí)慣,工作如此輕松。你是否正在尋找一本能夠更加深入地了解Java編程語(yǔ)言的書(shū),以便編寫(xiě)出更清晰、更正確、更健壯且更易于重用的代碼。不用找了!《Effective Java中文版(第2版)》為我們帶來(lái)了共78條程序員必備的經(jīng)驗(yàn)法則,針對(duì)你每天都會(huì)遇到的編程問(wèn)題提出了最有效、最實(shí)用的解決方案。 這本經(jīng)典Jolt獲獎(jiǎng)作品實(shí)屬眾望所歸。作者對(duì)新版進(jìn)行了徹底的更新。涵蓋了自第l版之后所引入的Java E5和Java SE 6的特性,同時(shí)開(kāi)發(fā)了新的設(shè)計(jì)模式和語(yǔ)言習(xí)慣用法,介紹了如何充分利用從泛型到枚舉、從注解到自動(dòng)裝箱的各種特性。每一章都包含幾個(gè)“條目”,以簡(jiǎn)潔的形式呈現(xiàn),自成獨(dú)立的短文,它們提出了具體的建議,對(duì)于Java平臺(tái)精妙之處的獨(dú)到見(jiàn)解,以及優(yōu)秀的代碼范例。每個(gè)條目的綜合描述和解釋都闡明了應(yīng)該怎么做,不應(yīng)該怎么做,以及為什么。
圖書(shū)封面
圖書(shū)標(biāo)簽Tags
無(wú)
評(píng)論、評(píng)分、閱讀與下載
Effective Java 第二版 中文版/Sun公司核心技術(shù)叢書(shū) PDF格式下載
250萬(wàn)本中文圖書(shū)簡(jiǎn)介、評(píng)論、評(píng)分,PDF格式免費(fèi)下載。 第一圖書(shū)網(wǎng) 手機(jī)版