第7章 通用编程(General Programming)
19 最小化局部变量的作用范围(Minimize the scope of local variables)
通过最小化局部变量的作用范围,可以提高代码的可读性和可维护性和减少出错的可能性。
最强有力的最小化局部变量作用范围的技术是当其首次使用时才定义它。
几乎所有的局部变量的定义都要包含初始值。例外的情况是当初始化该变量可能产生异常时,需要在try语句块之外定义此变量。
优先使用for循环而不是while循环。
保持方法小而且精。
20 了解并使用库(Know and use the libraries)
通过使用标准库,就充分利用了编写这些库的专家的知识以及在你之前使用这些库的人的经验。
每个一个重要版本都会有新的特征被加进来,了解这些新加进来的东西是有意义的。
每个编程人员应该熟悉java.lang, java.util和java.io库。
21 在要求精确结果的时候避免使用float和double(Avoid float and double if exact answers are required)
Float和double类型尤其不适合货币的计算。
在计算货币时使用BigDecimal,int或者long。
使用BigDecimal不方便,而且速度慢。可以使用int和long,自己跟踪小数点的位置。
如果数量不超过9位,可以使用int;如果不超过18位,可以使用long;超过18位就只能使用BigDecimal了。
22 当其它类型更合适的时候避免使用字符串(Avoid strings where other types are more appropriate)
String是其它值类型的不好的替代。
String是枚举类型的不好的替代。
String是聚集类型的不好的替代。
23 注意字符串连接的性能(Beware the performance of string concatenation)
当有多个字符串进行连接操作时,使用StringBuffer。
24 使用接口来引用对象(Refer to objects by their interfaces)
如果有合适的接口类型存在,则参数,返回值,变量和域都应该使用接口类型来定义。
如果养成了使用接口作为类型的习惯,你的程序将会更加灵活。
如果没有合适的接口存在的话,使用一个类来引用对象当然是合适的。此时,是由类继承结构中提供所需功能的最高层次的类。
25 优先使用接口而不是反射(Prefer interfaces to reflection)
使用反射的代价:失去所有编译时刻类型检查的好处;执行反射操作的代码冗长;性能下降。
反射应该只使用在设计阶段。在一般程序的运行时刻不应该通过反射来访问对象。
只以非常有限的形式使用反射。
可以通过反射创建实例,并且通过接口或者超类正常的访问它们。
另外一个使用反射的地方是:打破对某些可能在运行时刻不存在的类,方法或是域的依赖。如果你正在写一个包,它必须能和其它包的不同版本一块运行。这项技术就是在最小需要支持的环境下编译它,通常是最老的版本,然后反射的访问任何新的类或是方法。
26 谨慎使用本地方法(Use native methods judiciously)
自JDK 1.3之后,很少需要使用本地方法来提高性能了。
如果必须需要使用本地方法来访问底层资源或是遗产库,使用尽可能少的本地代码和进行完备的测试。
27 谨慎的进行优化(Optimize judiciously)
如果预先进行优化,则很容易出现问题。
尽力去写好的程序,而不是快的。
影响性能的结构上的失误很难修正,除非重写整个系统。所以在设计过程中要考虑性能。
尽力避免影响性能的设计决策。尤其在设计API,线路级的协议和持久数据格式时。
考虑你的API设计给性能带来的影响。
把API封装起来以达到好的性能是一个非常差的主意。
在尝试优化之前和之后衡量性能。
对Java平台来说,进行性能的衡量尤其重要。