下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

寄生型设计模式在Swing应用开发中的实践(3)

作者:课课家教育     来源: http://www.kokojia.com点击数:823发布时间: 2016-02-03 15:37:29

标签: javajava辅助类java开发

大神带你学编程,欢迎选课

  界面辅助类的缺陷

  界面辅助类使用中也存在可以优化的地方 ,比如辅助类的构建,完全可以在界面创建时自动构建并完成组件的映射设置工作,不用在 getAllComponents 方法中再手 工设置实现映射功能。

  另外也存在一个问题,当主窗体 ( 或其上的弹出对话框 ) 关闭时,为了清除内存,需要调 用 removeInstance 来将辅助类的实例移除,否则会导致内存泄露。在一个由 100 多人组成的开发团队,同时新老搭配, 产品生产周期很长的情况下,我们会发现很多 BUG 的出现就是忘记调用该方法。很多员工特别对新员工,对其原理不是太 理解,可能还认为,java 内存还需要我去管理的么?而且,错误定位非常复杂麻烦。

  界面助手类的对象特性分析

  界面助手类特性分析示意图

寄生型设计模式在Swing应用开发中的实践(3)_java_java辅助_课课家

  让我们回想一下我们创建界面助手类的目的 是什么?很简单,简化访问。界面助手类所访问的真正对象是 GUIEngine 中的界面组件。那么是否应有这样的特性, GUIEngine 对象不存在了,助手类的对象也应随之消失。或者说,界面助手类对象就象是 GUIEngine 对象的寄生体。当宿 主人不存在了,寄生体肯定也消失了。

  如果将 GUIEngine 对象比喻成人,那么界面助手类对象就象是使用 X 射线 机对人体进行透视看到的图像。虽然通过理论知识的学习,我们知道人体有多少块骨骼,但是却被皮肤遮住了,我们无法直 观地看到,通过 X 射线机我们就可以清晰地看到了。

  界面助手类的管理

  既然界面助手类主要麻烦在内存需 要手动释放其原理见下面示意图 4,我们需要找到一个更为简单释放内存的方法。

  手动释放内存原理示意图

  当界面 关闭时,由于辅助类是调用界面引擎的实例,所以界面类内存并没有完全释放,需要手动销毁辅助类实例,否则,长期运行 会导致内存泄露。

  此时我们可以首先想到,我们把这个辅助类,直接放在宿主类不就可以了吗?见下图 5

   改善后内存自动释放示意图

  当界面关闭时,由于辅助类是挂接在界面引 擎类中,所以界面关闭时,根据 Java 内存回收原理,辅助类就自动被销毁,内存对象被收回,避免了内存泄露的情况。

  这样在能够访问 GUIEngine 的地方我们都可以获得辅助类,当 GUIEngine 销毁时,也无法再获取到界面助手类了 。我们可以在 GUIEngine 中,增加一个方法 getGUIHelpMap(), 返还一个 HashMap 来替代辅助类中的

  private static HashMap instancePool = new HashMap();

  方法可以改写一下见下面代码:

  清单 4. 可以自动释放内存的关键代码清单

  public static

  UPSTypeHelper getInstance(GUIEngine guiEngine) {

  String guifile = guiEngine.getXMLfile();

  UPSTypeHelper instance = (UPSTypeHelper) guiEngine.getGUIHelpMap().get(guifile );

  if (instance == null) {

  instance = new UPSTypeHelper(guiEngine);

  guiEngine.getGUIMap().put(guifile , instance);

  }

  return instance;

  }

  代码行数差不多,但不用再手工调用 removeInstance 方法释放实例了。Java 语言的一个重要特性就是垃 圾回收,当 GUIEngine 对象被销毁后,附着在其上的对象也不再可达,辅助类就将被 GC 垃圾回收器回收。我们利用 Java 的垃圾回收特性实现了辅助对象的自动销毁,不用再负责辅助类的生命周期的管理工作了,这不也正是 Java 的便捷特性之 一么。

  我们还可以再深入想想,解决自动映射的问题,是否可以自动地完成 GUIEngine 中的界面控件到辅助类中定 义的成员的映射呢?我们知道,完成这个映射工作的主要是辅助类中的 getAllComponents 方法 , 既然要自动完成映射, 这个方法首先挪开。

赞(0)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程