1、检查参数的有效性
对于公有的方法,要用@Javadoc的@throws标签在文档中说明违反参数限制时会抛出的异常。
/**
*@throws ArithmeticException if m is less than or equals to 0
*/
public BigInteger mod(BigInteger m) {
if (m.sigum() <= 0)
throws new ArithmeticException("Modulus <= 0: " + m);
}
对于未被导出的方法,作为包的创建者,你可以控制这个方法将在哪些情况下被调用,因此你可以,也应该确保只将有效的参数值传递进来。
因此,非公有的方法通常应该使用断言来检查它们的参数,
// Private helper function for a recursive sort
private static void sort(long a[], int offset, int length) {
assert a != null;
assert offset >= 0 && length <= a.length;
assert length >= 0 && length <= a.length - offset;
}
assert 不同于一般的有效性检查,如果它们没有起到作用,本质上也不会有成本开销,除非通过将-ea(或者enableassertions)标记传给Java解释器,来启用它们。
不进行有效性检查的情况:有效性检查工作非常昂贵,或者根本是不切实际的,而且有效性检查已隐含在计算过程中完成。
2、必要是进行保护性拷贝
保护性拷贝时,如果要拷贝的类不是final的,就不能保证clone方法一定是此类的对象:它有可能返回专门出于恶意的目的而设计的不可信子类的实例。
3、谨慎设计方法签名
4、慎用重载
5、慎用可变参数
6、返回零长度的数组或者集合,而不是null
7、为所有导出的API元素编写文档注释