您的位置:首页 > 编程语言 > Java开发

《Java解惑》陷阱和缺陷的目录

2014-12-27 12:12 225 查看
陷阱和缺陷的目录

一、词汇问题

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产生以及极差的性能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: