诊断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); } }