陷阱和缺陷的目錄
一、詞彙問題
1、字母l在許多字型中都與數字1相像。
2、負的十六進製制字面常量看起來像是正的。
3、八進位制字面常量與十進位制字面常量相像。
4、ascii字元的unicode轉義字元容易令人迷茫。
5、反斜槓必須被轉義,即使是在注釋中。
6、塊注釋不要巢狀。
二、整數運算
1、%操作符的非零結果具有和左運算元相同的正負號。
2、整數運算的悄悄溢位。
3、int數值之差的正負號不能可靠地指示其大小順序。
4、復合賦值操作符可能造成悄悄的窄化轉型。
5、整數型別不對稱:integer.min_value是它自己的負值,long.min_value也一樣。
6、移位操作符只用了其右運算元的低位。
7、當在整數型別之間轉換時,如果源型別是有符號的則執行符號擴充套件。
三、浮點運算
1、浮點運算是不精確的。
2、nan不等於任何浮點數值,包括它自身。
3、從int到float,從long到float以及從long到double的轉換是有損精度的。
4、bigdecimal(double)構造器返回的是其浮點型引數的精確值。
四、表示式計算
1、混合型別計算容易令人迷茫。
2、操作符的運算元是從左到右計算的。
3、操作符的優先順序並不總是很明顯。
4、操作符==和!=在被包裝的基本型別上執行引用比較。
5、常量變數在所用的地方是內聯的。
6、操作符&和|即使在作用於布林型別的數值時,也要同時計算其兩個運算元。
五、控制流
1、在switch case語句中缺少break將導致控制流一貫而下。
2、在integer.max_value上終止以int為索引的迴圈是困難的。
3、finally語句塊的意外完成將掩飾掛起的控制傳輸。
4、為正常的控制流使用異常將導致bug和很差的效能。
六、類初始化
1、類初始化是自頂向下的。
2、noclassdeffounderror出現的時機是不可靠的。
七、例項的建立與銷毀
1、例項初始器在構造器方法體之前執行。
2、在構造器中呼叫被覆寫的方法會導致該方法在例項初始化之前執行。
3、引用無效會導致記憶體洩露。
4、新增私有構造器失敗會使類可例項化。
5、終結器是不可預知的、危險的,且速度很慢。
6、被轉殖的物件可以共享內部狀態。
八、其他與類和例項相關的主題
1、在靜態方法上沒有任何動態分派。
2、內部類是令人迷茫的。
3、不能做保護複製就會破壞不變性。
4、實現乙個介面會影響實現類的api。
5、int常量作為列舉值不安全。
6、混合使用基本型別和引數化型別將弱化型別檢查機制。
7、返回null而不是0長度的陣列或者集合有產生錯誤的傾向。
九、名字重用
1、想要覆寫時很容易就變成了過載。
2、過載解析規則不明顯。
3、隱藏實體的程式難以理解。
4、遮蔽實體的程式難以理解。
5、遮掩實體的程式難以理解。
6、與所在類具有相同名字的方法看似構造器。
7、重用平台類名的程式難以理解。
十、字串
1、陣列不能覆寫object.tostring。
2、string.replaceall以正規表示式作為第乙個引數。
3、string.replaceall以置換字串作為第二個引數。
4、重複地進行字串連線可能導致極差的效能。
5、從位元組陣列到字元陣列的轉換需要指定字符集。
6、char型別值只會預設轉換成int,而不是string。
十一、i/o
1、stream.close可以丟擲ioexception異常。
2、printstream.write(int)不重新整理輸出流。
3、要消費掉乙個程序的輸出,否則該程序可能掛起。
十二、執行緒
1、呼叫thread.run不能啟動乙個執行緒。
2、庫類可能鎖住或通知它們的例項。
3、thread.interrupted會清除中斷狀態。
4、類初始化過程中將持有該類的鎖。
5、在共享可變狀態時同步失敗,可能導致不能觀察狀態的變化。
6、在被同步的語句塊中呼叫外部方法可能導致死鎖。
7、在while迴圈的外部呼叫wait方法會引發不可預知的行為。
8、對執行緒排程器的依賴可能導致不定的且平台依賴的行為。
十三、反射
1、反射將檢查對實體和實體所屬類的訪問許可權。
2、用反射例項化內部類需要乙個額外的引數。
3、class.newinstance可以丟擲未宣告的受檢查異常。
十四、序列化
1、讓乙個類可序列化將引入乙個公共的偽構造器。
2、序列化形式是類的公共api的一部分。
3、使用預設的序列化形式會在類的公共api中洩露私有字段。
4、使用預設的序列化形式可能會導致效能低下。
5、維護例項的不變規則需要乙個readresolve方法。
6、宣告序列版本uid失敗會導致脆弱。
7、如果readobject或readresolve呼叫了可覆寫的方法,反序列化迴圈的物件可能引發崩潰。
十五、其他庫
1、覆寫equals方法而不覆寫hashcode方法可能會引發不定的行為。
2、calendar和date設計得很差勁。
3、許多類不管其方法名是什麼,這些類都是不可變的。
4、某些被廢棄的方法對程式來說就是毒藥。
5、使用自編的解決方案而不是庫容易導致努力白費、bug產生以及極差的效能。
C陷阱和缺陷 連線
一,概念 聯結器的作用在於把有編譯器或彙編器生成的若干個目標模組,整合成乙個被稱為載入模組或可執行檔案的實體,該實體能夠被作業系統直接執行。其中,某些模組式直接作為輸入提供給聯結器的 而另外一些目標木塊則是根據連線過程的需要,從包括有型別printf函式的庫檔案中取得的。二,連線過程問題的根源 c程...
C陷阱和缺陷學習筆記
詞法陷阱 1 不同於 不要在程式中將兩者寫錯,小心。將表示式與常量比較時,可將常量放在左邊。2 和 不同於 和 3 詞法分析中的貪心法 每個符號應該包含盡可能多的字元。如果 編譯器的 輸入流截至某個字元前都已經分解為乙個個符號,那麼下乙個符號將包括從該字元之後可能組成乙個字元的最長字串。如y x p...
讀《C陷阱和缺陷》(三)
以前一直不知道位運算中的 是什麼情況,今天看了一下位運算,感覺好簡單,前兩者跟運算子 差不多,只不過位運算中操作是按二進位制的方法操作的,比如10和 12他們的二進位制為 1010 和1100 進行 運算,每一位比較出來的結果為 1000 結果是 8。進行 運算,每一位比較的結果是 1110 結果是...