我们接下来讨论一下Java语言的细节,包括局部变量的处理,库的使用,以及两种不是语言本身提供的机制的使用等等一些大家平时可能忽略的问题。

Item 29:将局部变量的作用域最小化

和C语言要求局部变量必须被生命在代码的开始处相比,Java程序设计语言宽松得多,它允许你在代码的任何位置声明。要想使一个局部变量的作用域最小化,最高小的技术是在第一次需要使用它的地方声明,变量的作用域是从声明它的地方开始到这个声明做在的代码块的结束位止,如果我们把变量的声明和代码的使用位置分开的过大,那么对于读这段代码的人来说,是很不幸的。

我们几乎都是在一个局部变量声明的地方同时给它初始化,注意这是很重要的,甚至有时候,如果我们的初始化应该推迟到下一个代码的位置,我们同时应该把声明也往后延迟。这条规则唯一的例外是try-catch这个语句,因为如果一个变量被方法初始化,那么这个方法很有可能抛出一个异常,那我们最常用的方法就是把它置于try块的内部去进行初始化。由此我们可以得出,for循环优于while循环,我们在能使用for循环的地方尽量使用for而不使用while,因为for循环是完全独立的,所以重用循环变量名字不会有任何伤害。

最后我们要记住的是尽量把我们的函数写的小而集中,这样才能真正组做到”最小化局部变量的作用域”这一要旨。

Item 30:了解和使用库

使用标准库,我们可以充分利用编写这些库的Java专家的知识,以及在你之前其他人的使用经验,这就是所谓站在巨人的肩膀上看世界吧~

在每一个Java平台的发行版本里面,都会有许多新的包的加入,和这些更新保持一直是值得的,比如说我们J2ME的开发,在MIDP 1.0的时代,我们要写个Game还要自己动手写工具类,现在MIDP2.0推出之后,大多数写游戏的人都觉得方便了很多,因为在这个版本里面加入了游戏包,为我们的开发节省了大量的人力物力。

     Item 31:如果想要知道精确的答案,就要避免使用double和float

     对于金融行业来说,对数据的严整性要求是很高的,不容半点马虎,那大家都知道再我们的Java语言里面有两个浮点数类型的变量float和double,可能大家会认为他们的精度对于金融行业这样对数字敏感的行业来说,已经够用了,但是在开发当中,我们要尽量少使用double和float,因为让他们精确的表达0.1是不可能的。那我们如何解决这个问题呢,答案是使用BigDecimal,int或者long进行货币计算。在这里对大家的忠告是:对于商务运算,我们尽量使用BigDecimal,对于性能要求较高的地方,我们有能力自己处理十进制的小数点,数值不太大的时候,我们可以使用int或者long,根据自己的需要来判定具体使用哪一个,如果范围超过了18位数,那我们必须使用BigDecimal。 

     Item 32:如果其他类型更适合,则尽量避免使用字符串

     在偶看到这条建议之前,我就很喜欢用字符串,不管在什么场合下,先String了再说,但是实际上很多情况下,我们要根据实际情况来判定到底使用什么类型,而且字符串不适合替代枚举类型,类型安全枚举类型和int值都比字符串更适合用来表示枚举类型的常量。字符串也不适合替代聚集类型,有一个更好的方法就是简单的写一个类来描述这个数据集,通常是一个私有的静态成员类最好。字符串也不适合代替能力表,总而言之,如果可以适合更加适合的数据类型,或者可以编写更加适当的数据类型,那么应该避免使用字符串来表示对象。 

Item 33:了解字符串的连接功能

我们经常在使用System.out.println()的时候,往括号里写一串用“+”连接起来的字符串,这是我们最常见的,但是这个方法并不适合规模较大的情形,为连接N个字符串而重复地使用字符串连接操作符,要求N的平方级的时间,这是因为字符串是非可变的,这就导致了在字符串进行连接的时候,前后两者都要拷贝,这个时候我们就提倡使用StingBuffer替代String。 

Item 34:通过接口引用对象

通俗的说就是尽量优先使用接口而不是类来引用对象,如果有合适的接口存在那么对使用参数,返回值,变量域都应该使用接口类型养成使用接口作为对象的习惯,会使程序变得更加灵活。

如果没有合适的接口,那么,用类而不是接口来引用一个对象,是完全合适的。

Item 35:接口优先于映像机制

java.lang.relect提供了“通过程序来访问关于已装载的类的信息”,由此,我们可以通过一个给定的Class实例,获得Constructor,Method和Field实例。

映像机制允许一个类使用另一个类,即使当前编译的时候后者还不存在,但是这种能力也要付出代价:

我们损失了了编译时类型检查的好处,而且要求执行映像访问的代码非常笨拙和冗长,并且在性能上大大损失。

通常,普通应用在运行时刻不应以映像方式访问对象。

Item 36:谨慎的使用本地方法

JNI允许Java应用程序调用本地方法,所谓本地方法是指用本地程序设计语言(如C,C++)来编写的特殊方法,本地方法可以在本地语言执行任何计算任务,然后返回到Java程序设计语言中。但是随着JDK1.3及后续版本的推出这种通过使用本地方法来提高性能的方法已不值得提倡,因为现在的JVM越来越快了,而且使用本地方法有一些严重的缺点,比如使Java原本引以为傲的安全性荡然无存,总之在使用本地方法的时候要三思。

Item 37:谨慎使用优化

不要因为性能而牺牲合理的代码结构,努力编写好的程序而不是快的程序,但是避免那些限制性能的设计决定,同时考虑自己设计的API决定的性能后果,为了获得更好的性能而对API进行修改这也是一个非常不好的想法,通常我们在做优化之后,都应该对优化的程度进行一些测量。

Item 38:遵守普遍接受的命名惯例

Java有一套比较完善的命名惯例机制,大部分包含在《The Java Language Specification》,严格得讲这些惯例分成两类,字面的和语法的。

字面涉及包,类,接口,方法和域,语法的命名惯例比较灵活,所以争议更大,字面惯例是非常直接和明确的,而语法惯例则相对复杂,也很松散。但是有一个公认的做法是:“如果长期养成的习惯用法与此不同的话,请不要盲目遵从.