快速业务通道

诊断Java代码: Liar View错误模式 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19
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. 检查视图、模型及行的内容

import java.awt.*; import java.awt.event*; import java.util.Vector; import java.swing.*; public class Controller {    . . .   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();    boolean toggle = model.toggle;    model.add("test0");    assert ( toggle == ! model.toggle);    controller.pause();    toggle = model.toggle;    model.add("test1");    assert ( toggle == ! model.toggle);    controller.pause();    assert(model.getSize(

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