Effective Java 阅读笔记——通用程序设计
45:将局部变量的作用域最小化
好处:增强代码的可读性和可维护性,并降低出错的可能性
How:
- 在第一次使用它的地方声明,而不是集中在代码块的开头
- 几乎对于每个局部变量都应该在可以对其进行有意义的初始化时再声明。例外情况:如果一个变量由一个可能抛出受检异常的方法来初始化,且该变量在对该异常进行扑捉的try-catch块之外用到,那么该变量就必须在try块之前声明,且进行比如null等无意义的初始化
- 当循环之后不再需要使用循环变量时,优先选用for而不是while。因为:for对循环变量的作用域做了更好的限制;可以避免由于复制-粘贴循环代码而产生的循环变量混乱的错误;for循环且比for更简短,可读性更好。
- 使方法小而集中
一个自己没注意到的好习惯:
1 for(int i = 0, n = expensiveComputation(); i < n; i++) { //而不是在for外面声明n 2 dosomething(i); 3 }
46:for-each循环优于传统的for循环
for-each可用于:集合、数组以及任何实现Iterable接口的对象
优势:简洁、更好的BUG预防能力、没有性能损失,且由于其只对数组边界计算一次,优于那些每次循环都要计算数组边界的for
但是这些情形无法使用for-each,而须使用for:
- 过滤:需要遍历集合并删除某些元素
- 转换:需要遍历元素并对某些元素进行值设定
- 平行迭代
47:了解和使用类库
好处:
- 利用专家的经验,而不是重复造轮子
- 集中精力于自己应用程序的实现而不是底层细节
- 类库会获得更新,性能持续提升
- 让自己的代码更主流,更易读
需要重点关注的:java.lang java.util,特别是Collections和concurrent。可能的话还包括java.io。
48:如果需要精确的答案,请避免使用float和double
尤其在货币计算时,因为货币对小数点的计算更加敏感
可行方案:
- 使用BigDecimal:优点数值范围大,计算准确,且提供多种舍入方式。缺点:使用稍不方便且计算慢
- int或者long:自己来记录小数点位置。比如所有的钱都以分为单位,这样就不会出现小数点。int可以表示不超过9位的十进制数,long是18位
49:基本类型优先于装箱基本类型
基本类型与装箱基本类型的区别:
- 基本类型只有值,而装箱基本类型则具有与它们的值不同的同一性,即两个装箱基本类型可以有相同的值和不同的同一性(因为它们是不同的实例)
- 装箱基本类型还可以为null值
- 基本类型通常比装箱基本类型更加节省时间和空间
注意:
- 使用“==”比较两个装箱基本类型,不仅比较它们的值,还比较它们的同一性
- 如果在一项操作中混合使用基本类型和装箱基本类型时,装箱基本类型会自动拆箱
- 如果null对象被自动拆箱,则会产生NullPointException异常
50:如果其他类型更合适,则尽量避免使用字符串
比如使用字符串代替其他值类型、枚举、聚集类型以及能力表等
51:当心字符串连接的性能
使用StringBuilder替代String之间的+运算
52:通过接口引用对象
如果有合适的接口存在,那么对于参数、返回值、变量和域来说,他们都应该使用接口进行声明,除非程序中使用了依赖于某个实现类具有的而接口不具有的功能。
对于基于类的框架,则应该使用其基类来声明
53:接口优先于反射机制
使用反射在类型安全、性能等方面都有损失,所以除非必要,最好不用。如果有可能,就应该仅仅使用反射机制来实例化对象,而访问对象时则使用编译时已知的某个接口或者超类
54:谨慎的使用本地方法
由于JVM越来越快,且本地语言不是安全的,且与平台相关,使用了本地方法的应用程序也不再是可自由移植的,使用本地方法来提高性能的做法不值得提倡
55:谨慎的进行优化
系统的性能应该在设计系统的时候认真考虑,尤其不能为了性能而牺牲合理的结构,好的程序比快的程序更重要。
56:遵守普遍接受的命名惯例

浙公网安备 33010602011771号