下面我们来讨论一下有关方法设计的几个方面,下面说的几个要点大多数都是应用在构造函数中,当然也使用于普通方法,我们追求的依然是程序的可用性,健壮性和灵活性。
Item 23:检查参数的有效性
非公有的方法我们应该用断言的方法来检查它的参数,而不是使用通常大家所熟悉的检查语句来检测。假如我们使用的开发平台是JDK1.4或者更高级的平台,我们可以使用assert结构;否则我们应该使用一种临时的断言机制。
有些参数在使用过程中是先保存起来,然后在使用的时候再进行调用,构造函数正是这种类型的一种体现,所以我们通常对构造函数参数的有效性检查是非常仔细的。
Item 24:需要时使用保护性拷贝
众所周知,Java在代码安全性方面较C/C++有显著的提高,缓冲区溢出,数组越界,非法指针等等,我们的JAVA都有一个很完善的机制来进行免疫,但是这并不代表我们不必去考虑JAVA的安全性,即便在安全的语言,假如不采取措施,还是无法使自己与其他类隔开。假设类的客户会尽一切手段来破坏这个类的约束条件,在这样的前提下,你必须从保护性的方面来考虑设计程序。通过大量的程序代码研究我们得出这样的结论:对于构造性函数的每个可变参数进行保护性拷贝是必要的。需要注重的是,保护性拷贝是在检查参数的有效性之前 进行的,并且有效性检查是针对拷贝之后的对象,而不是原始的对象。对于“参数类型可以被不可信方子类化”的情况,不要用clone方法来进行参数的保护性拷贝。
对于参数的保护性拷贝并不仅仅在于非可变类,当我们编写一个函数或者一个构造函数的时候,假如它要接受客户提供的对象,答应该对象进入到内部数据结构中,则有必要考虑一下,客户提供的对象是否是可变的,假如是,则要考虑其变化的范围是否在你的程序所能容纳的范围内,假如不是,则要对对象进行保护性拷贝,并且让拷贝之后的对象而不是原始对象进入到数据结构中去。当然最好的解决方法是使用非可变的对象作为你的对象内部足见,这样你就可以不必关心保护性拷贝问题了。):