诊断Java代码: 连续初始化器错误模式 - 编程入门网
ue) throws CantTakeZeroException {
if (_value == 0) {
if (canTakeZero) {
value = new DefaultSimpleInteger(_value);
}
else {
throw new CantTakeZeroException(this);
}
}
else {
value = new DefaultSimpleInteger(_value);
}
}
public int intValue() {
return ((DefaultSimpleInteger)value).intValue();
}
}
interface SimpleInteger {
}
class NonValue implements SimpleInteger {
public static NonValue ONLY = new NonValue();
private NonValue() {}
}
class DefaultSimpleInteger implements SimpleInteger {
private int value;
public DefaultSimpleInteger(int _value) {
value = _value;
}
public int intValue() {
return value;
}
}
诊断Java代码: 连续初始化器错误模式(4)时间:2011-02-11 IBM Eric E. Allen现在,如果您的任何访问这个域的客户机类要在结果元素上执行一个 intValue 操作,则由于 NonValues 不支持该操作,所以这些客户机类必须首先强制转型成 DefaultSimpleInteger 。 上述办法的优点是您将不断地在代码中您忘记了强制转型的各个地方得到提示(通过编译器错误),指出这个方法调用无法在该缺省值上工作。而且,在运行时,如果您碰巧访问了这个域,而它包含缺省值,那您就将得到一个 ClassCastException ,它将包含比您原来将会得到的 NullPointerException 多得多的信息 ― ClassCastException 将不仅告诉您那里实际发生了什么,而且还将告诉您程序在那里应该是什么样子。 缺点是性能将有所损失。每当域被访问时,程序都还要执行一个强制转型。 如果您觉得不需要编译错误消息也行,那另一种解决方案是在接口 SimpleInteger 中包含 intValue 方法。然后,您就可以用一个抛出任何您想抛出的错误在缺省类中实现这个方法,(而且您可以包含您想包含的任何信息)。为了说明这一点,请考察如下示例: 清单 3. 抛出异常的 NonValue
诊断Java代码: 连续初始化器错误模式(5)时间:2011-02-11 IBM Eric E. Allen这个解决方案能够比 ClassCastException 提供更好的错误诊断。而且它还更高效,因为在运行时不需要强制转型。 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |