诊断Java代码: Double Descent错误情势[Java编程]
本文“诊断Java代码: Double Descent错误情势[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
不要强迫转换这个类!
与可怕的 空指针非常(该非常除了报告空指针之外,关于将要发生的事情什么也不说)差别,类强迫转换非常相对来说简单调试.
类强迫转换常常发生在递归下行数据构造的程序中,普通是现代码的某些部份在每次办法调用中下行了两级且在第二次下行时调度不当时发生的.程序员可通过学习 Double Descent 错误情势来辨认这种问题.
Double Descent 错误情势
本周的专题是 Double Descent 错误情势.它通过类强迫转换非常来表明.它是由递归下行复合数据构造惹起的,这种下行方法有时在一次递归调用中要下行多级.这样做常常需求增添范例强迫转换来编译代码.但是,在这种下行中,很简单忘掉查抄能否满意了得当的不变量来保证这些范例强迫转换成功.
考虑以下的 int 二元树的类层次构造.因为我们但愿考虑到空树的情形,所以将不把 value 字段放入 Leaf 类中.由于这一决意使全部的 Leaf 相同,我们将用一个静态字段为 Leaf 保存一个单元素.
清单 1. int 二元树的类层次构造
abstract class Tree {
}
class Leaf extends Tree {
public static final Leaf ONLY = new Leaf();
}
class Branch extends Tree {
public int value;
public Tree left;
public Tree right;
public Branch(int _value, Tree _left, Tree _right) {
this.value = _value;
this.left = _left;
this.right = _right;
}
}
目前,假定我们但愿在 Tree 上增添一个办法,该办法肯定肆意两个联贯的节点(比方一个分支和它的此中一个子分支)能否都包含一个 0 作为它们的值.我们大概增添以下办法(注意:最后一个办法将不以它的当前情势编译):
清单 2. 肯定两个联贯的节点能否都包含值 0 的办法
// in class Tree:
public abstract boolean hasConsecutiveZeros();
// in class Leaf:
public boolean hasConsecutiveZeros() {
return false;
}
// in class Branch:
public boolean hasConsecutiveZeros() {
boolean foundOnLeft = false;
boolean foundOnRight = false;
if (this.value == 0) {
foundOnLeft = this.left.value == 0;
foundOnRight = this.right.value == 0;
}
if (foundOnLeft || foundOnRight) {
return true;
}
else {
foundOnLeft = this.left.hasConsecutiveZeros();
foundOnRight = this.right.hasConsecutiveZeros();
return foundOnLeft || foundOnRight;
}
}
以上是“诊断Java代码: Double Descent错误情势[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |