欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
《Effective Java》讀書(shū)筆記(二)- ssun - 新浪BLOG
第六章:方法
第二十三條:檢查參數的有效性
1 對于公有的方法,使用Javadoc @throws標簽,聲明拋出異常。
2 非公有的方法使用assertions來(lái)檢查它們的參數。
3 在一個(gè)方法執行之前,應該檢查它的參數。
第二十四條:需要時(shí)使用保護性拷貝
1 對于構造函數的每個(gè)可變參數進(jìn)行保護性拷貝(defensive copy)是必要的 eg: constructor(Type x){Type _x = new Type(x);}
2 保護性拷貝動(dòng)作是在檢查參數有效性之前進(jìn)行的,并且有效性檢查是針對拷貝之后的對象,而不是原始的對象。
3 對于“參數類(lèi)型可以被不可信方子類(lèi)化”的情形,請不要使用clone方法進(jìn)行參數的保護性拷貝,因為clone方法有可能返回子類(lèi)。
4 如果你不能容忍將要進(jìn)入你的類(lèi)內部的對象還會(huì )發(fā)生發(fā)生變化,那么就使用defensive copy。
5 把一個(gè)指向內部可變組件的引用返回給客戶(hù)之前,應該考慮使用defensive copy。
6 非零長(cháng)度的數組總是可變的。解決方案:返回該數組的一個(gè)非可變視圖。
第二十五條:謹慎設計方法的原型
1 謹慎選擇方法的名字:遵循標準的命名習慣,易于理解+大眾認可
2 不要過(guò)于追求提供便利的方法:不要復雜化類(lèi)設計。
3 避免長(cháng)長(cháng)的參數列表,類(lèi)型相同的長(cháng)參數序列尤其有害:解決辦法是,把一個(gè)方法分解成多個(gè)方法;創(chuàng )建輔助類(lèi),用來(lái)保存參數的聚集(aggregate),往往是靜態(tài)成員類(lèi)。
4 對于參數類(lèi)型,優(yōu)先使用接口而不是類(lèi):提高將來(lái)的擴展性
5 謹慎使用函數對象:特定的模式下再使用,eg:strategy和visitor模式
第二十六條:謹慎地使用重載
重載方法(overloaded method):方法名相同,參數列表不同。
改寫(xiě)方法(overwritten method):子類(lèi)中包含的方法聲明與父類(lèi)中的一個(gè)方法聲明具有同樣的原型。
內容:
1 對于重載方法的選擇是靜態(tài)的,而對于被改寫(xiě)方法的選擇是動(dòng)態(tài)的,即根據被調用所在對象的運行時(shí)類(lèi)型。
2 改寫(xiě)機制是規范,而重載機制是例外,應該避免方法重載機制的混淆用法。
3 永遠不要導出兩個(gè)具有相同參數數目的重載方法:可以給方法起不同的名字。
4 一個(gè)類(lèi)的多個(gè)構造函數總是重載的:可以使用靜態(tài)工廠(chǎng)方法解決。
5 使用重載的時(shí)候注意,盡量保證參數列表中至少有一個(gè)對應的形參具有“根本不同”的類(lèi)型(指一種類(lèi)型的實(shí)例轉換成另一種類(lèi)型是不可能的)
6 當兩個(gè)重載方法在同樣的參數上被調用時(shí),他們執行相同的功能,則重載就不會(huì )帶來(lái)危害。
第二十七條:返回零長(cháng)度的數組而不是null
內容:
沒(méi)有理由從一個(gè)取數組值得方法中返回null,而不是返回一個(gè)零長(cháng)度數組。
理由:簡(jiǎn)化方法調用者的返回值檢查;在這個(gè)層次上擔心性能問(wèn)題是不明智的;對于不返回任何元素的調用,每次都返回同一個(gè)零長(cháng)度數組是有可能的,因為零長(cháng)度數組是非可變的。
一個(gè)慣用方法:一個(gè)零長(cháng)度數組常量被傳遞給toArray方法,以指明所期望的返回類(lèi)型。
第二十八條:為所有導出的API元素編寫(xiě)文檔注釋
內容:為了正確的編寫(xiě)API文檔,你必須在每一個(gè)被導出的類(lèi),接口,構造函數,方法和域聲明之前增加一個(gè)文檔注釋。
1 每一個(gè)方法的文檔注釋?xiě)摵?jiǎn)潔地描述出它和客戶(hù)之間的約定:所有前提條件和后置條件,以及它的副作用(sideeffect),和類(lèi)的線(xiàn)程安全性。
2 每個(gè)文檔注釋的第一句話(huà)是該注釋所屬元素的概要描述,獨立地描述目標實(shí)體的功能。
3 概要描述中不要有句號,也不要使用縮寫(xiě)和十進(jìn)制小數。
4 對于方法和構造函數,概要描述應該是一個(gè)動(dòng)詞短語(yǔ),描述了該方法所執行的動(dòng)作。
5 對于類(lèi),接口和域,概要描述應該是一個(gè)名詞短語(yǔ),它描述了該類(lèi)或者接口的實(shí)例,或者域本身所代表的事物。

第七章:通用程序設計
第二十九條:將局部變量的作用域最小化
好處:增加代碼的可讀性和可維護性,并降低出錯的可能性。
規則:
1 在第一次使用的地方聲明
2 盡量讓每一個(gè)局部變量的聲明都包含一個(gè)初始化表達式
3 如果在循環(huán)終止之后循環(huán)變量的內容不再被需要的話(huà),則for循環(huán)優(yōu)先于while循環(huán)
4 使方法小而集中
第三十條:了解和使用庫
1 通過(guò)使用標準庫,你可以充分利用專(zhuān)家知識,以及前人經(jīng)驗
2 不必浪費時(shí)間在底層的細節上
3 無(wú)需你做任何努力,它們的性能會(huì )不斷提高
4 使自己的代碼融入主流,更易懂,易維護
第三十一條:如果要求精確的答案,避免使用float和double
原因:讓float或者double精確地表達10的任何負數次方值是不可能的。
解決辦法:使用BigDecimal,int或者long進(jìn)行計算。BigDecimal容許完全控制舍入。
第三十二條:如果其他類(lèi)型更合適,則盡量避免使用字符串
1 字符串不適合代替其他的值類(lèi)型:只有當數值本身是文本信息時(shí),才是合理的,否則都應該被轉換為適當的數值類(lèi)型
2 字符串不適合代替枚舉類(lèi)型:使用類(lèi)型安全枚舉類(lèi)型
3 字符串不適合代替聚集類(lèi)型
4 字符串不適合代替能力表
第三十三條:了解字符串連接的性能
內容:不適合規模大的情形,為連接n個(gè)字符串而重復地使用字符串連接符要求n的平方級的時(shí)間,這是因為字符串是非可變的。
第三十四條:通過(guò)接口引用對象
內容:如果有合適的接口存在,那么對參數,返回值,變量和域的聲明都應該使用接口類(lèi)型,只有當你創(chuàng )建某個(gè)對象的時(shí)候,才真正需要引用這個(gè)對象的類(lèi)。
好處:提高靈活性
不存在合適的接口類(lèi)型的情形:1 一個(gè)具體類(lèi)沒(méi)有相關(guān)聯(lián)的接口;2 對象屬于一個(gè)框架,而框架的基本類(lèi)型是類(lèi);3 一個(gè)類(lèi)實(shí)現了一個(gè)接口,但是它提供了接口中不存在的額外方法。
總結:如果合適的接口存在,使用它,否則使用類(lèi)層次結構中提供了所需功能的最高層的類(lèi)
第三十五條:接口優(yōu)先于映像機制
映像機制(reflection)容許一個(gè)類(lèi)使用另一個(gè)類(lèi),即使當前者被編譯的時(shí)候后者還根本不存在。
影響的代價(jià):損失了編譯時(shí)類(lèi)型檢查的好處;代碼笨拙冗長(cháng);性能損失(2倍)。
內容:通常,普通應用在運行時(shí)刻不應該以映像方式訪(fǎng)問(wèn)對象,如果你編寫(xiě)的程序必須要與編譯時(shí)刻未知的類(lèi)一起工作,那么盡量使用映像機制實(shí)例化對象,而訪(fǎng)問(wèn)對象時(shí)使用編譯時(shí)刻已知的某個(gè)接口或者超類(lèi)。
第三十六條:謹慎地使用本地方法
本地方法:用本地語(yǔ)言(c c++)編寫(xiě)的特殊方法
本地方法的好處:提供了訪(fǎng)問(wèn)平臺相關(guān)的設施的能力,提供了訪(fǎng)問(wèn)老式代碼庫的能力,實(shí)現性能關(guān)鍵部分。
本地方法的缺點(diǎn):不安全,不可移植,較高的固定開(kāi)銷(xiāo),代碼難以閱讀。
總結:隨著(zhù)1.3發(fā)行版本的推出,使用本地方法已經(jīng)不提倡
第三十七條:謹慎地進(jìn)行優(yōu)化
內容:
1 優(yōu)化更容易帶來(lái)傷害,而不是好處,特別是不成熟的優(yōu)化
2 努力編寫(xiě)好的程序而不是快的程序
3 努力避免那些限制性能的設計決定:特別注意模塊之間交互關(guān)系的組件eg:API,永久數據格式
4 考慮你的API設計決定的性能后果
5 一旦你已經(jīng)謹慎的設計了程序,產(chǎn)生了一個(gè)清晰,簡(jiǎn)明,結構良好的實(shí)現,那么就可以開(kāi)始考慮優(yōu)化了
第三十八條:遵守普遍接受的命名慣例
1 包的名字應該是層次狀的,用句號分割每一部分,每一部分包括小寫(xiě)字母和數字:edu.sjtu
2 包名字的剩余部分應該包括一個(gè)或者多個(gè)描述該包的組成部分,鼓勵有意義的縮寫(xiě):util
3 類(lèi)和接口的名字應該包括一個(gè)或者多個(gè)單詞,每個(gè)單詞的首字母大寫(xiě):TimerTask
4 方法和域的命名類(lèi)似類(lèi)和接口,只是名字的第一個(gè)單詞為小寫(xiě):ensureCapacity
5 常量域包含一個(gè)或者多個(gè)大寫(xiě)形式的單詞,中間由下劃線(xiàn)符號分割開(kāi)
6 類(lèi)通常用一個(gè)名詞或者名次短語(yǔ)命名:Timer
7 執行某個(gè)動(dòng)作的方法通常用一個(gè)動(dòng)詞或者動(dòng)詞短語(yǔ)來(lái)命名:drawImage,isDigit
8 轉換對象類(lèi)型的方法,通常為toType:toString
9 返回一個(gè)視圖的方法為asType:asList
10 返回一個(gè)與被調用對象同值的原語(yǔ)類(lèi)型的方法為typeValue:intValue
11 靜態(tài)工廠(chǎng)的常用名字:valueOf,getInstance
第八章:異常
第三十九條:只針對不正常的條件才使用異常
內容:異常只應該被用于不正常的條件,它們永遠不應該被用于正常的控制流,一個(gè)設計良好的API不應該強迫它的客戶(hù)為了正常的控制流而使用異常。
理由:創(chuàng )建,拋出和捕獲異常的開(kāi)銷(xiāo)很昂貴;把代碼塊放在try-catch中會(huì )阻止JVM的優(yōu)化
第四十條:對于可恢復的條件使用被檢查的異常,對于程序錯誤使用運行時(shí)異常
1 如果期望調用者能夠恢復,那么使用被檢查的異常
2 用運行時(shí)異常來(lái)指明程序錯誤
3 錯誤往往被保留用來(lái)指示資源不足,約束失敗。所以不要再實(shí)現任何新的Error類(lèi)
4 你所實(shí)現的所有未被檢查的拋出結構都應該是RuntimeException的子類(lèi)
第四十一條:避免不必要地使用被檢查的異常
理由:如果一個(gè)方法會(huì )拋出一個(gè)或者多個(gè)被檢查的異常,那么調用該方法的代碼必須在一個(gè)或者多個(gè)catch塊中處理這些異常,或者它必須聲明這些異常,以便讓它們傳播出去,這給程序員增添了麻煩。
使用被檢查異常的條件:正確的使用API并不能阻止這種異常條件的產(chǎn)生;一旦產(chǎn)生了異常,使用API的程序員可以采取有用的動(dòng)作。
第四十二條:盡量使用標準的異常
好處:使你的API更加易于學(xué)習和使用;可讀性更好;異常類(lèi)越少,意味著(zhù)內存占用越少。
常用的異常:IllegalArgumentException, IllegalStateException, NullPointerException, IndexOutOfBoundsException
第四十三條:拋出的異常要適合于相應的抽象
內容:
1 異常轉譯(exception translation),高層的實(shí)現應該捕獲底層的異常,同時(shí)拋出一個(gè)可以按照高層抽象進(jìn)行解釋的異常。
2 異常鏈接(exception chaining),底層的異常被高層的異常保存起來(lái),并且高層的異常提供一個(gè)公有的訪(fǎng)問(wèn)方法來(lái)獲得底層的異常。
3 盡量不要將異常從底層傳播到高層,除非保證底層的異常對于高層也是合適的。
第四十四條:每個(gè)方法拋出的異常都要有文檔
1 總是要單獨的聲明被檢查的異常,并且利用Javadoc的@throws標記,準確地記錄下每個(gè)異常被拋出的條件
2 每個(gè)方法的文檔應該描述它的前提條件,在文檔中記錄下未被檢查的異常是描述前提條件的最佳做法,雖然未被檢查的異常并不要求被聲明
3 使用Javadoc的@throws標簽記錄一個(gè)方法可能會(huì )拋出的每個(gè)未被檢查的異常,但是不要使用throws關(guān)鍵字將未被檢查的異常包含在方法的聲明中
4 如果一個(gè)類(lèi)中的許多方法出于同樣的原因而拋出同一個(gè)異常,那么在該類(lèi)的文檔注釋中對這個(gè)異常做文檔,而不是為每一個(gè)方法單獨做文檔。
第四十五條:在細節消息中包含失敗-捕獲信息
1 為了捕獲失敗,一個(gè)異常的字符串表示應該包含所有對該異常有貢獻的參數和域的值
2 為一個(gè)異常的失敗捕獲信息提供一些訪(fǎng)問(wèn)方法是合適的
第四十六條:努力使失敗保持原子性
內容:一個(gè)失敗的方法調用應該使對象保持它在被調用之前的狀態(tài)。當一個(gè)方法拋出錯誤時(shí),它不需要保持失敗原子性。
方法:
1 設計一個(gè)非可變對象
2 在執行操作之前檢查參數的有效性
3 對計算處理過(guò)程調整順序,使得任何可能會(huì )失敗的計算部分都發(fā)生在對象狀態(tài)被修改之前
4 編寫(xiě)一段恢復代碼,使對象的狀態(tài)回滾到操作開(kāi)始之前的狀態(tài)
5 在對象的一份臨時(shí)拷貝上執行操作,當操作完成之后再把臨時(shí)拷貝中的結果復制給原來(lái)的對象
第四十七條:不要忽略異常
內容:空的catch塊會(huì )使異常達不到應有的目的,至少catch也應該包含一個(gè)說(shuō)明,用來(lái)解釋為什么忽略掉這個(gè)異常,空的catch塊會(huì )導致程序在遇到錯誤的情況下悄然地執行下去。
第九章:線(xiàn)程
第四十八條:對共享可變數據的同步訪(fǎng)問(wèn)
內容:
1 同步不僅可以阻止一個(gè)線(xiàn)程看到對象處于不一致的狀態(tài)中,它還可以保證通過(guò)一系列看似順序執行的狀態(tài)轉變序列,對象從一種一致的狀態(tài)變遷到另一種一致的狀態(tài)。
2 為了在線(xiàn)程之間可靠地通信,以及為了互斥訪(fǎng)問(wèn),同步時(shí)需要的。
3 使用正確的同步方法來(lái)執行遲緩初始化。
4 無(wú)論何時(shí)當多個(gè)線(xiàn)程共享可變數據的時(shí)候,每個(gè)或者寫(xiě)數據的線(xiàn)程必須獲得一把鎖。
第四十九條:避免過(guò)多的同步
內容:過(guò)多的同步可能會(huì )導致性能降低,死鎖,甚至不確定的行為。
1 為了避免死鎖的危險,在一個(gè)被同步的方法或者代碼塊中,永遠不要調用一個(gè)可被改寫(xiě)的公有或者受保護的方法
2 通常,在同步區域內應該做盡可能少的工作,獲得鎖,檢查共享數據,根據需要轉換數據,然后放掉鎖。
3 在一個(gè)類(lèi)的內部執行同步,一個(gè)很好的理由是它將被大量地并發(fā)使用,而且通過(guò)執行內部細粒度的同步操作可以獲得很高的并發(fā)性
4 如果一個(gè)類(lèi)或者一個(gè)靜態(tài)方法依賴(lài)于一個(gè)可變的靜態(tài)域,那么它必須要在內部執行同步
第五十條:永遠不要在循環(huán)的外部調用wait
內容:總是使用wait循環(huán)模式來(lái)調用wait方法。
第五十一條:不要依賴(lài)于線(xiàn)程調度器
內容:任何依賴(lài)于線(xiàn)程調度器而達到正確性或者性能要求的程序,很有可能是不可移植的。
解決:盡可能確保在任何給定時(shí)刻只有少量的可運行線(xiàn)程,讓每個(gè)線(xiàn)程做少量工作,然后使用Object.wait等待某個(gè)條件發(fā)生,或者使用sleep
第五十二條:線(xiàn)程安全性的文檔化
1 在一個(gè)方法的聲明中出現synchronized修飾符,這是一個(gè)實(shí)現細節,并不是到處的API的一部分
2 一個(gè)類(lèi)為了可被多個(gè)線(xiàn)程安全地使用,必須在文檔中清楚地說(shuō)明它所支持的線(xiàn)程安全性級別(immutable,thread-safe,conditionally threda-safe,thread-compatible,thread-hostile)
  immutable,thread-safe:不需要外部同步;conditionally thread-safe:需要被順序執行;thread-compatible:在每個(gè)方法調用的外圍使用外部同步。thread-hostile:不能被多個(gè)線(xiàn)程安全使用。
 
第五十三條:避免使用線(xiàn)程組
內容:線(xiàn)程組已經(jīng)過(guò)時(shí)。
第十章:序列化
序列化:將一個(gè)對象編碼成一個(gè)字節流,相反的過(guò)程為反序列化。
第五十四條:謹慎地實(shí)現serializable
原因:
1 一旦一個(gè)類(lèi)被發(fā)布,則改變這個(gè)類(lèi)的實(shí)現的靈活性就大大降低,因為它的字節流編碼成為它的導出API的一部分。
2 增加了錯誤和安全漏洞的可能性:對象創(chuàng )建機制
3 隨著(zhù)一個(gè)新版本的發(fā)行,相關(guān)的測試負擔增加了
4 為了繼承而設計的類(lèi)應該很少實(shí)現serializable,接口也應該很少會(huì )擴展它,否則就會(huì )給擴展這個(gè)類(lèi)的程序員背上沉重的負擔
5 對于為了繼承而設計的不可序列化的類(lèi),應該考慮提供一個(gè)無(wú)參數的構造函數
6 內部類(lèi)應該很少實(shí)現serializable,除非是靜態(tài)類(lèi)
第五十五條:考慮使用自定義的序列化形式
1 若沒(méi)有認真考慮默認序列化是否合適,則不要接受這種形式
2 如果一個(gè)對象的物理表示等同于它的邏輯內容,則默認的序列化形式是合適的
3 即使你確定了默認序列化形式是合適的,你仍然需要提供一個(gè)readObject方法以保證約束關(guān)系和安全性
4 當一個(gè)對象的物理表示與它的邏輯數據內容有實(shí)質(zhì)區別時(shí),不要使用默認序列化形式,因為:導出API約束在實(shí)現上;消耗過(guò)多空間;消耗時(shí)間;棧溢出;
5 在決定將一個(gè)域做成非transient之前,確信它的值將是該對象邏輯狀態(tài)的一部分
6 為自己編寫(xiě)的每個(gè)可序列化的類(lèi)聲明一個(gè)顯示的序列版本UID
第五十六條:保護性地編寫(xiě)readObject方法
內容:對于每一個(gè)可序列化的非可變類(lèi),如果它包含了私有的可變組件,那么在它的readObject方法中,必須要對這些組件進(jìn)行保護性拷貝
指導原則:
1 對于對象引用域必須保持為私有的類(lèi),對將被保存到這些域中的對象進(jìn)行保護性拷貝
2 對于具有約束條件的類(lèi),一定要檢查約束條件是否滿(mǎn)足
3 不要調用類(lèi)中可被改寫(xiě)的方法
第五十七條:必要時(shí)提供一個(gè)readResolve方法
內容:
1 readResolve方法不僅對于singleton對象是必要的,而且對于所有其他的實(shí)例受控的類(lèi)也是必需的
2 作為保護性的readObject方法的一種保守的替代選擇
   
好習慣:
     1 客戶(hù)通過(guò)接口來(lái)引用被返回的對象,而不是通過(guò)實(shí)現類(lèi)來(lái)引用被返回的對象。
     2 用盡可能簡(jiǎn)單的方法使對象進(jìn)入正常狀態(tài);如果可以的話(huà),避免調用其它方法。在構造器中唯一能夠安全調用的那些方法是基類(lèi)中的final方法(包括private)
     3 用繼承表達行為間的差異,并用組合表達狀態(tài)上的變化。
     4 一旦一個(gè)元素<img src="<input type="image" src="<input type="radio" name="<input type="checkbox" name="<input type="checkbox" name="<input type="checkbox" name="<input type="checkbox" name="" value="">" value="">" value="">" value="">" value="">">">被釋放掉,則該元素中包含的任何對象引用就應該被清空。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
面試題目1
100個(gè)你應該知道的java基礎知識
java總結
C# 知識點(diǎn)匯總整理
Java封神之路:Java面試備戰(五)
struts1和struts2的區別
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久