《Java解惑》陷阱和缺陷的目录
生活随笔
收集整理的這篇文章主要介紹了
《Java解惑》陷阱和缺陷的目录
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
陷阱和缺陷的目錄
一、詞匯問(wèn)題
1、字母l在許多字體中都與數(shù)字1相像。
2、負(fù)的十六進(jìn)制字面常量看起來(lái)像是正的。
3、八進(jìn)制字面常量與十進(jìn)制字面常量相像。
4、ASCII字符的Unicode轉(zhuǎn)義字符容易令人迷茫。
5、反斜杠必須被轉(zhuǎn)義,即使是在注釋中。
6、塊注釋不要嵌套。
二、整數(shù)運(yùn)算
1、%操作符的非零結(jié)果具有和左操作數(shù)相同的正負(fù)號(hào)。
2、整數(shù)運(yùn)算的悄悄溢出。
3、int數(shù)值之差的正負(fù)號(hào)不能可靠地指示其大小順序。
4、復(fù)合賦值操作符可能造成悄悄的窄化轉(zhuǎn)型。
5、整數(shù)類型不對(duì)稱:Integer.MIN_VALUE是它自己的負(fù)值,Long.MIN_VALUE也一樣。
6、移位操作符只用了其右操作數(shù)的低位。
7、當(dāng)在整數(shù)類型之間轉(zhuǎn)換時(shí),如果源類型是有符號(hào)的則執(zhí)行符號(hào)擴(kuò)展。
三、浮點(diǎn)運(yùn)算
1、浮點(diǎn)運(yùn)算是不精確的。
2、NaN不等于任何浮點(diǎn)數(shù)值,包括它自身。
3、從int到float,從long到float以及從long到double的轉(zhuǎn)換是有損精度的。
4、BigDecimal(double)構(gòu)造器返回的是其浮點(diǎn)型參數(shù)的精確值。
四、表達(dá)式計(jì)算
1、混合類型計(jì)算容易令人迷茫。
2、操作符的操作數(shù)是從左到右計(jì)算的。
3、操作符的優(yōu)先級(jí)并不總是很明顯。
4、操作符==和!=在被包裝的基本類型上執(zhí)行引用比較。
5、常量變量在所用的地方是內(nèi)聯(lián)的。
6、操作符&和|即使在作用于布爾類型的數(shù)值時(shí),也要同時(shí)計(jì)算其兩個(gè)操作數(shù)。
五、控制流
1、在switch case語(yǔ)句中缺少break將導(dǎo)致控制流一貫而下。
2、在Integer.MAX_VALUE上終止以int為索引的循環(huán)是困難的。
3、finally語(yǔ)句塊的意外完成將掩飾掛起的控制傳輸。
4、為正常的控制流使用異常將導(dǎo)致bug和很差的性能。
六、類初始化
1、類初始化是自頂向下的。
2、NoClassDefFoundError出現(xiàn)的時(shí)機(jī)是不可靠的。
七、實(shí)例的創(chuàng)建與銷毀
1、實(shí)例初始器在構(gòu)造器方法體之前執(zhí)行。
2、在構(gòu)造器中調(diào)用被覆寫的方法會(huì)導(dǎo)致該方法在實(shí)例初始化之前運(yùn)行。
3、引用無(wú)效會(huì)導(dǎo)致內(nèi)存泄露。
4、添加私有構(gòu)造器失敗會(huì)使類可實(shí)例化。
5、終結(jié)器是不可預(yù)知的、危險(xiǎn)的,且速度很慢。
6、被克隆的對(duì)象可以共享內(nèi)部狀態(tài)。
八、其他與類和實(shí)例相關(guān)的主題
1、在靜態(tài)方法上沒(méi)有任何動(dòng)態(tài)分派。
2、內(nèi)部類是令人迷茫的。
3、不能做保護(hù)復(fù)制就會(huì)破壞不變性。
4、實(shí)現(xiàn)一個(gè)接口會(huì)影響實(shí)現(xiàn)類的API。
5、int常量作為枚舉值不安全。
6、混合使用基本類型和參數(shù)化類型將弱化類型檢查機(jī)制。
7、返回null而不是0長(zhǎng)度的數(shù)組或者集合有產(chǎn)生錯(cuò)誤的傾向。
九、名字重用
1、想要覆寫時(shí)很容易就變成了重載。
2、重載解析規(guī)則不明顯。
3、隱藏實(shí)體的程序難以理解。
4、遮蔽實(shí)體的程序難以理解。
5、遮掩實(shí)體的程序難以理解。
6、與所在類具有相同名字的方法看似構(gòu)造器。
7、重用平臺(tái)類名的程序難以理解。
十、字符串
1、數(shù)組不能覆寫Object.toString。
2、String.replaceAll以正則表達(dá)式作為第一個(gè)參數(shù)。
3、String.replaceAll以置換字符串作為第二個(gè)參數(shù)。
4、重復(fù)地進(jìn)行字符串連接可能導(dǎo)致極差的性能。
5、從字節(jié)數(shù)組到字符數(shù)組的轉(zhuǎn)換需要指定字符集。
6、char類型值只會(huì)默認(rèn)轉(zhuǎn)換成int,而不是String。
十一、I/O
1、Stream.close可以拋出IOException異常。
2、PrintStream.write(int)不刷新輸出流。
3、要消費(fèi)掉一個(gè)進(jìn)程的輸出,否則該進(jìn)程可能掛起。
十二、線程
1、調(diào)用Thread.run不能啟動(dòng)一個(gè)線程。
2、庫(kù)類可能鎖住或通知它們的實(shí)例。
3、Thread.interrupted會(huì)清除中斷狀態(tài)。
4、類初始化過(guò)程中將持有該類的鎖。
5、在共享可變狀態(tài)時(shí)同步失敗,可能導(dǎo)致不能觀察狀態(tài)的變化。
6、在被同步的語(yǔ)句塊中調(diào)用外部方法可能導(dǎo)致死鎖。
7、在while循環(huán)的外部調(diào)用wait方法會(huì)引發(fā)不可預(yù)知的行為。
8、對(duì)線程調(diào)度器的依賴可能導(dǎo)致不定的且平臺(tái)依賴的行為。
十三、反射
1、反射將檢查對(duì)實(shí)體和實(shí)體所屬類的訪問(wèn)權(quán)限。
2、用反射實(shí)例化內(nèi)部類需要一個(gè)額外的參數(shù)。
3、Class.newInstance可以拋出未聲明的受檢查異常。
十四、序列化
1、讓一個(gè)類可序列化將引入一個(gè)公共的偽構(gòu)造器。
2、序列化形式是類的公共API的一部分。
3、使用默認(rèn)的序列化形式會(huì)在類的公共API中泄露私有字段。
4、使用默認(rèn)的序列化形式可能會(huì)導(dǎo)致性能低下。
5、維護(hù)實(shí)例的不變規(guī)則需要一個(gè)readResolve方法。
6、聲明序列版本UID失敗會(huì)導(dǎo)致脆弱。
7、如果readObject或readResolve調(diào)用了可覆寫的方法,反序列化循環(huán)的對(duì)象可能引發(fā)崩潰。
十五、其他庫(kù)
1、覆寫equals方法而不覆寫hashCode方法可能會(huì)引發(fā)不定的行為。
2、Calendar和Date設(shè)計(jì)得很差勁。
3、許多類不管其方法名是什么,這些類都是不可變的。
4、某些被廢棄的方法對(duì)程序來(lái)說(shuō)就是毒藥。
5、使用自編的解決方案而不是庫(kù)容易導(dǎo)致努力白費(fèi)、bug產(chǎn)生以及極差的性能。
一、詞匯問(wèn)題
1、字母l在許多字體中都與數(shù)字1相像。
2、負(fù)的十六進(jìn)制字面常量看起來(lái)像是正的。
3、八進(jìn)制字面常量與十進(jìn)制字面常量相像。
4、ASCII字符的Unicode轉(zhuǎn)義字符容易令人迷茫。
5、反斜杠必須被轉(zhuǎn)義,即使是在注釋中。
6、塊注釋不要嵌套。
二、整數(shù)運(yùn)算
1、%操作符的非零結(jié)果具有和左操作數(shù)相同的正負(fù)號(hào)。
2、整數(shù)運(yùn)算的悄悄溢出。
3、int數(shù)值之差的正負(fù)號(hào)不能可靠地指示其大小順序。
4、復(fù)合賦值操作符可能造成悄悄的窄化轉(zhuǎn)型。
5、整數(shù)類型不對(duì)稱:Integer.MIN_VALUE是它自己的負(fù)值,Long.MIN_VALUE也一樣。
6、移位操作符只用了其右操作數(shù)的低位。
7、當(dāng)在整數(shù)類型之間轉(zhuǎn)換時(shí),如果源類型是有符號(hào)的則執(zhí)行符號(hào)擴(kuò)展。
三、浮點(diǎn)運(yùn)算
1、浮點(diǎn)運(yùn)算是不精確的。
2、NaN不等于任何浮點(diǎn)數(shù)值,包括它自身。
3、從int到float,從long到float以及從long到double的轉(zhuǎn)換是有損精度的。
4、BigDecimal(double)構(gòu)造器返回的是其浮點(diǎn)型參數(shù)的精確值。
四、表達(dá)式計(jì)算
1、混合類型計(jì)算容易令人迷茫。
2、操作符的操作數(shù)是從左到右計(jì)算的。
3、操作符的優(yōu)先級(jí)并不總是很明顯。
4、操作符==和!=在被包裝的基本類型上執(zhí)行引用比較。
5、常量變量在所用的地方是內(nèi)聯(lián)的。
6、操作符&和|即使在作用于布爾類型的數(shù)值時(shí),也要同時(shí)計(jì)算其兩個(gè)操作數(shù)。
五、控制流
1、在switch case語(yǔ)句中缺少break將導(dǎo)致控制流一貫而下。
2、在Integer.MAX_VALUE上終止以int為索引的循環(huán)是困難的。
3、finally語(yǔ)句塊的意外完成將掩飾掛起的控制傳輸。
4、為正常的控制流使用異常將導(dǎo)致bug和很差的性能。
六、類初始化
1、類初始化是自頂向下的。
2、NoClassDefFoundError出現(xiàn)的時(shí)機(jī)是不可靠的。
七、實(shí)例的創(chuàng)建與銷毀
1、實(shí)例初始器在構(gòu)造器方法體之前執(zhí)行。
2、在構(gòu)造器中調(diào)用被覆寫的方法會(huì)導(dǎo)致該方法在實(shí)例初始化之前運(yùn)行。
3、引用無(wú)效會(huì)導(dǎo)致內(nèi)存泄露。
4、添加私有構(gòu)造器失敗會(huì)使類可實(shí)例化。
5、終結(jié)器是不可預(yù)知的、危險(xiǎn)的,且速度很慢。
6、被克隆的對(duì)象可以共享內(nèi)部狀態(tài)。
八、其他與類和實(shí)例相關(guān)的主題
1、在靜態(tài)方法上沒(méi)有任何動(dòng)態(tài)分派。
2、內(nèi)部類是令人迷茫的。
3、不能做保護(hù)復(fù)制就會(huì)破壞不變性。
4、實(shí)現(xiàn)一個(gè)接口會(huì)影響實(shí)現(xiàn)類的API。
5、int常量作為枚舉值不安全。
6、混合使用基本類型和參數(shù)化類型將弱化類型檢查機(jī)制。
7、返回null而不是0長(zhǎng)度的數(shù)組或者集合有產(chǎn)生錯(cuò)誤的傾向。
九、名字重用
1、想要覆寫時(shí)很容易就變成了重載。
2、重載解析規(guī)則不明顯。
3、隱藏實(shí)體的程序難以理解。
4、遮蔽實(shí)體的程序難以理解。
5、遮掩實(shí)體的程序難以理解。
6、與所在類具有相同名字的方法看似構(gòu)造器。
7、重用平臺(tái)類名的程序難以理解。
十、字符串
1、數(shù)組不能覆寫Object.toString。
2、String.replaceAll以正則表達(dá)式作為第一個(gè)參數(shù)。
3、String.replaceAll以置換字符串作為第二個(gè)參數(shù)。
4、重復(fù)地進(jìn)行字符串連接可能導(dǎo)致極差的性能。
5、從字節(jié)數(shù)組到字符數(shù)組的轉(zhuǎn)換需要指定字符集。
6、char類型值只會(huì)默認(rèn)轉(zhuǎn)換成int,而不是String。
十一、I/O
1、Stream.close可以拋出IOException異常。
2、PrintStream.write(int)不刷新輸出流。
3、要消費(fèi)掉一個(gè)進(jìn)程的輸出,否則該進(jìn)程可能掛起。
十二、線程
1、調(diào)用Thread.run不能啟動(dòng)一個(gè)線程。
2、庫(kù)類可能鎖住或通知它們的實(shí)例。
3、Thread.interrupted會(huì)清除中斷狀態(tài)。
4、類初始化過(guò)程中將持有該類的鎖。
5、在共享可變狀態(tài)時(shí)同步失敗,可能導(dǎo)致不能觀察狀態(tài)的變化。
6、在被同步的語(yǔ)句塊中調(diào)用外部方法可能導(dǎo)致死鎖。
7、在while循環(huán)的外部調(diào)用wait方法會(huì)引發(fā)不可預(yù)知的行為。
8、對(duì)線程調(diào)度器的依賴可能導(dǎo)致不定的且平臺(tái)依賴的行為。
十三、反射
1、反射將檢查對(duì)實(shí)體和實(shí)體所屬類的訪問(wèn)權(quán)限。
2、用反射實(shí)例化內(nèi)部類需要一個(gè)額外的參數(shù)。
3、Class.newInstance可以拋出未聲明的受檢查異常。
十四、序列化
1、讓一個(gè)類可序列化將引入一個(gè)公共的偽構(gòu)造器。
2、序列化形式是類的公共API的一部分。
3、使用默認(rèn)的序列化形式會(huì)在類的公共API中泄露私有字段。
4、使用默認(rèn)的序列化形式可能會(huì)導(dǎo)致性能低下。
5、維護(hù)實(shí)例的不變規(guī)則需要一個(gè)readResolve方法。
6、聲明序列版本UID失敗會(huì)導(dǎo)致脆弱。
7、如果readObject或readResolve調(diào)用了可覆寫的方法,反序列化循環(huán)的對(duì)象可能引發(fā)崩潰。
十五、其他庫(kù)
1、覆寫equals方法而不覆寫hashCode方法可能會(huì)引發(fā)不定的行為。
2、Calendar和Date設(shè)計(jì)得很差勁。
3、許多類不管其方法名是什么,這些類都是不可變的。
4、某些被廢棄的方法對(duì)程序來(lái)說(shuō)就是毒藥。
5、使用自編的解決方案而不是庫(kù)容易導(dǎo)致努力白費(fèi)、bug產(chǎn)生以及極差的性能。
總結(jié)
以上是生活随笔為你收集整理的《Java解惑》陷阱和缺陷的目录的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Parallel 并发编程实例
- 下一篇: 动态规划例子