快速业务通道

Java理论与实践: 消除bug - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
希”中,我略述了正确地重载 Object.equals() 和 Object.hashCode() 的基本规则,特别是相等对象(根据 equals() ) 的 hashCode() 值必须相等。虽然只要了解了这项规则,遵守起来就相当简单(并 且有些 IDE 包含一些向导,用于以一致的风格为您定义这两个方法),但是如 果重载了其中一个方法,而忘记重载另一个方法,那么通过检测很难找出 bug, 因为错误并非位于存在的代码中,而是位于不存在码中。

FindBugs 有一个检测器用于检测这个问题的很多实例,如重载了 equals() 但没有重载 hashCode() ,或重载了 hashCode() 但没有重载 equals() 。这些 检测器是 FindBugs 中最简单的,因为它们只需要检查该类中一组方法签名,并 确定是否同时重载了 equals() 和 hashCode() 。还可能错误地使用 Object 之 外的参数类型定义 equals() ;虽然这个构造是合法的,但是它的行为和您想像 的不同。Covariant Equals 检测器将检测如下有问题的重载:

public void boolean equals(Foo other) { ... }

与这个检测器相关的是 Confusing Method Names 检测器,它是对名称类似 hashcode() 和 tostring() 的方法触发的,对于下面这些类也会触发这个检测 器:具有一些只在名称大小写方面存在差异的方法,或者其方法与超类构造函数 的名称相同。虽然根据该语言的规范,这些方法名称是合法的,但是它们可能不 是您想要的。类似地,如果域 serialVersionUID 不是 final ,不是 long , 也不是 static ,就会触发 Serialization 检测器。

Java理论与实践: 消除bug(2)

时间:2010-12-20 IBM Brian Goetz

Finalizer 不是朋友

在“ Garbage collection and performance”中,我尽力阻止使用 finalizer。Finalizer 需要牺牲很多性能,并且它们不能(甚至完全不能)保 证在预计的时间段运行。仍然有些时候需要使用 finalizer,而这样做的过程中 可能产生很多错误。如果必须使用 finalizer,通常应该如清单 2 所示来组织 它:

清单 2. 正确的 finalizer 定义

protected void finalize() {    try {     doStuff();    }    finally {     super.finalize();    }   }

FindBugs 检测很多有问题的 finalizer 构造,如:

空的 finalizer(它抵消超类 finalizer 的作用)。

不实现任何功能的 finalizer(它只调用 super.finalize() ,但是这对运 行时优化可能造成一些损害)。

显式的 finalizer 调用(从用户代码中调用 finalize() )。

公共 finalizer(finalizer 应该声明为 protected )。

没有调用 super.finalize() 的 finalizer。

这些 bug 模式的例子如清单 3 所示:

清单 3. 常见的 finalizer 错误

// negates effect of superclass finalizer   protected void finalize() { }   // fails to call superclass finalize method   protected void finalize() { doSomething(); }   // useless (or worse) finalizer   protected void finalize() { super.finalize(); }   // public finalizer   public void finalize() { try { doSomething(); } finally { super.finalize() } }

在“ Garbage collection and performance”中,还讲到另一种垃圾收集危 险:显式地调用 System.gc() 。这种显式的调用几乎完全是“帮助”或“欺骗 ”来机收集器的误导尝试,并且它们最终经常损害性能,而不是对其有利。 FindBugs 可以检测显式的 System.gc() 调用,并标记它们(在 Sun JVM 上, 还可以使用 -XX:+DisableExplicitGC 启动选项,禁用显式的垃圾收集)。

安全构造技术

在“ Java 理论和实践:安全构造技术”中,我展示了允许对象的引用逃避 其构造函数如何导致一

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号