首页 / 软件开发 / JAVA / 诊断Java代码: 连续初始化器错误模式
诊断Java代码: 连续初始化器错误模式2011-02-11 IBM Eric E. Allen您经常会看到代码不是仅仅通过调用构造函数对类进行初始化,它还通过一些紧接着的意在设置各个域的动作对类进行初始化。不幸的是,这样紧接着的动作是错误的高发地带,会带来连续初始化(run-on initialization)类型的错误。连续初始化由于各种原因(多数是糟糕的),您经常会看到这样的类定义,其中的类构造函数并不带有足够的参数来适当地初始化类的所有域。这样的构造函数要求客户机类用几个步骤来对实例进行初始化(设置未被初始化的域的值),而不是用一个构造函数调用就行了。以这样的方式初始化实例是一个易于出错的过程,我把它称为 连续初始化。这个过程产生的各种错误类型有相似的症状和治疗方法,所以我们可以将它们统统归入一种称为 连续初始化器错误模式的模式。例如,考虑以下代码:清单 1. 一个简单的连续初始化class RestrictedInt {
public Integer value;
public boolean canTakeZero;
public RestrictedInt(boolean _canTakeZero) {
canTakeZero = _canTakeZero;
}
public void setValue(int _value) throws CantTakeZeroException {
if (_value == 0) {
if (canTakeZero) {
value = new Integer(_value);
}
else {
throw new CantTakeZeroException(this);
}
}
else {
value = new Integer(_value);
}
}
}
class CantTakeZeroException extends Exception {
public RestrictedInt ri;
public CantTakeZeroException(RestrictedInt _ri) {
super("RestrictedInt can"t take zero");
ri = _ri;
}
}
class Client {
public static void initialize() throws CantTakeZeroException {
RestrictedInt ri = new RestrictedInt(false);
ri.setValue(0);
}
}