Java理论与实践: 消除bug - 编程入门网
希”中,我略述了正确地重载 Object.equals() 和 Object.hashCode() 的基本规则,特别是相等对象(根据 equals() ) 的 hashCode() 值必须相等。虽然只要了解了这项规则,遵守起来就相当简单(并 且有些 IDE 包含一些向导,用于以一致的风格为您定义这两个方法),但是如 果重载了其中一个方法,而忘记重载另一个方法,那么通过检测很难找出 bug, 因为错误并非位于存在的代码中,而是位于不存在码中。
FindBugs 有一个检测器用于检测这个问题的很多实例,如重载了 equals() 但没有重载 hashCode() ,或重载了 hashCode() 但没有重载 equals() 。这些 检测器是 FindBugs 中最简单的,因为它们只需要检查该类中一组方法签名,并 确定是否同时重载了 equals() 和 hashCode() 。还可能错误地使用 Object 之 外的参数类型定义 equals() ;虽然这个构造是合法的,但是它的行为和您想像 的不同。Covariant Equals 检测器将检测如下有问题的重载:
与这个检测器相关的是 Confusing Method Names 检测器,它是对名称类似 hashcode() 和 tostring() 的方法触发的,对于下面这些类也会触发这个检测 器:具有一些只在名称大小写方面存在差异的方法,或者其方法与超类构造函数 的名称相同。虽然根据该语言的规范,这些方法名称是合法的,但是它们可能不 是您想要的。类似地,如果域 serialVersionUID 不是 final ,不是 long , 也不是 static ,就会触发 Serialization 检测器。 Java理论与实践: 消除bug(2)时间:2010-12-20 IBM Brian GoetzFinalizer 不是朋友 在“ Garbage collection and performance”中,我尽力阻止使用 finalizer。Finalizer 需要牺牲很多性能,并且它们不能(甚至完全不能)保 证在预计的时间段运行。仍然有些时候需要使用 finalizer,而这样做的过程中 可能产生很多错误。如果必须使用 finalizer,通常应该如清单 2 所示来组织 它: 清单 2. 正确的 finalizer 定义
FindBugs 检测很多有问题的 finalizer 构造,如: 空的 finalizer(它抵消超类 finalizer 的作用)。 不实现任何功能的 finalizer(它只调用 super.finalize() ,但是这对运 行时优化可能造成一些损害)。 显式的 finalizer 调用(从用户代码中调用 finalize() )。 公共 finalizer(finalizer 应该声明为 protected )。 没有调用 super.finalize() 的 finalizer。 这些 bug 模式的例子如清单 3 所示: 清单 3. 常见的 finalizer 错误
在“ Garbage collection and performance”中,还讲到另一种垃圾收集危 险:显式地调用 System.gc() 。这种显式的调用几乎完全是“帮助”或“欺骗 ”来机收集器的误导尝试,并且它们最终经常损害性能,而不是对其有利。 FindBugs 可以检测显式的 System.gc() 调用,并标记它们(在 Sun JVM 上, 还可以使用 -XX:+DisableExplicitGC 启动选项,禁用显式的垃圾收集)。 安全构造技术 在“ Java 理论和实践:安全构造技术”中,我展示了允许对象的引用逃避 其构造函数如何导致一 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |