快速业务通道

诊断Java代码: 连续初始化器错误模式 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19
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

class RestrictedInt implements SimpleInteger {   public SimpleInteger value;   public boolean canTakeZero;   public RestrictedInt(boolean _canTakeZero) {    canTakeZero = _canTakeZero;    value = NonValue.ONLY;   }   public void setValue(int _value) 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 value.intValue();   } } interface SimpleInteger {   public int intValue(); } class NonValue implements SimpleInteger {   public static NonValue ONLY = new NonValue();   private NonValue() {}   public int intValue() {    throw new     RuntimeException("Attempt to access an int from a NonValue");   } } class DefaultSimpleInteger implements SimpleInteger {   private int value;   public DefaultSimpleInteger(int _value) {    value = _value;   }   public int intValue() {    return value;   } }

诊断Java代码: 连续初始化器错误模式(5)

时间:2011-02-11 IBM Eric E. Allen

这个解决方案能够比 ClassCastException 提供更好的错误诊断。而且它还更高效,因为在运行时不需要强制转型。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号