诊断Java代码: Liar View错误模式 - 编程入门网
ruptedException e) {
}
}
public static void main(String[] args) {
Controller controller = new Controller();
JFrame frame = new JFrame("Test");
Model model = new Model();
JList view = new JList(model);
view.setPreferredSize(new Dimension(200,100));
frame.getContentPane().add(view);
frame.pack();
frame.setVisible(true);
assert(model.getSize() == 0);
controller.pause();
model.add("test0");
controller.pause();
model.add("test1");
controller.pause();
assert(model.getSize() == 2);
controller.pause();
model.remove(0);
controller.pause();
assert(model.getSize() == 1);
controller.pause();
System.exit(0);
}
}
class Model extends AbstractListModel {
private Vector elements = new Vector();
public synchronized Object getElementAt(int index) {
return elements.get(index);
}
public synchronized int getSize() {
return elements.size();
}
public synchronized void add(Object o) {
int index = this.getSize();
this.elements.add(o);
this.fireIntervalAdded(this, index, index);
}
public synchronized void remove(int index) {
this.elements.remove(index);
}
}
诊断Java代码: Liar View错误模式(3)时间:2011-02-12 IBM Eric E. Allen您可能已经注意到这段代码有一个严重错误。如果我们运行这段测试代码,所有的断言都会是成功的,它表明已在列表中正确地添加或除去了项目。但如果我们通过某种方法,例如把 PAUSE 设成 1000,使运行速度降下来,那么我们就能以手工检查的方式运行测试。猜猜结果是什么?我们注意到,视图中不曾有项目被除去。 视图没被更新的原因是, Model 类中的 remove() 方法从未调用 fireIntervalRemoved() 来通知侦听器:模型的状态已经改变了。 但我们的测试方法中的所有断言都取得了成功。为什么呢?因为这些断言只是在模型中,而不是在视图中检查发生的更改。因为模型被适当地更新了,断言没能检测到遗漏的事件触发。 治疗及预防措施 防止这种错误模式的一种方法是: 只在修改模型的状态之后才检查视图的显式属性。虽然这种技术把我们能检查的属性限制在视图提供的范围内,但至少能使断言反映屏幕上实际正在发生的事情。 例如,我们可重写 Controller.main ,如下所示: 清单 2. 检查视图、模型及行的内容
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |