第9章 通用编程
57,将局部变量的作用域最小化
要使局部变量地作用域最小化,最有力的方法时在第一次要使用它地地方进行声明。
几乎每一个局部变量地声明都应该包含一个初始化表达式。
for 循环优先于 while 循环。
58,for-each 循环优于传统的 for 循环
for-each 不会有性能损失,通过完全隐藏迭代器或者索引常量,避免了混乱和出错的可能。
以下三种情况不适合使用 for-each 循环
- 解构过滤
- 转换
- 平行迭代
59,了解和使用类库
熟悉和使用标准类库,不要重复造轮子。
60,如果需要精确的答案,请避免使用 float 和 double
float 和 double 尤其不适合货币计算。
使用BigDecimal,int,long进行货币计算。
对于任何需要精确答案的计算任务,都不应该使用 float 和 double。
61,基本类型优于装箱基本类型
基本类型优于装箱基本类型的三个主要区别:
- 基本类型只有值,而装箱基本类型则具有与它们的值不同的同一性。
- 基本类型只有函数值,而装箱基本类型则都有一个非函数值(加了一个null)。
- 基本类型比基本装箱类型更节省空间和时间。
对装箱类型使用 == 操作符几乎总是错的。
62,如果其他类型更合适,请尽量避免使用字符串
字符串不适合代替其他的值类型。
字符串不适合替代枚举类型。
字符串不适合代替聚合类型。
字符串也不适合代替能力表。
63,了解字符串连接的性能
为连接 n 个字符串而重复使用字符串连接操作符,需要 n 的平方级时间。
为了获得可以接受的性能,请用 StringBuilder 代替 String。用 append 连接字符串。
不要使用字符串连接操作符来合并多个字符串。
使用字符数组时,应该每次只处理一个字符串,而不是将它们组合起来。
64,通过接口引用对象
如果有合适的接口存在,那么对于参数,返回值,变量,和域来说,都应该使用它们的接口类型来进行声明。
如果养成了接口作为类型的习惯,程序将会更加灵活。
如果没有合适的接口存在,完全可以用类而不是接口来引用对象。
65,接口优于反射机制
反射机制的缺点:
- 损失了编译时类型检查的优势。
- 执行反射访问所需的代码非常笨拙和冗长。
- 性能损失。
如果编写的程序必须要与编译时未知的类一起工作,如果可能,就应该仅仅使用反射来实例化对象,而访问对象时则使用编译时已知的某个接口或者超类。
66,谨慎使用本地方法
JVM 已经越来越快,使用本地方法来提高性能的做法不值得提倡。
只有极少数情况需要使用本地方法来提高性能。如果必须要使用,则需要进行全面测试,因为本地代码中只要有一个 bug 就可能会破坏整个应用程序。
67,谨慎地进行优化
要努力写好的程序而不是快的程序。
熬努力避免那些限制性能的设计决策。
要考虑API设计决策的性能后果,
为获得好的性能而对API进行封装是一种不好的想法。
每次试图做优化之前和之后,要对性能进行测量。
68,遵守普遍地命名惯例
遵循阿里《Java开发手册》命名规范。