当前位置: 首页 > 面试题库 >

具有匿名EventListener的JPanel-为什么GC不破坏监听器?

宋经赋
2023-03-14
问题内容

我一直在仔细阅读JMapViewer的开源代码。如果有人希望查看它,请检查SVN。

简而言之,主要类是JMapViewer,这是a的扩展JPanel。还有一个非常重要的类称为DefaultMapController,它充当MouseListener主要类的。

我注意到的第一个奇怪的事情是查看器没有对控制器的引用。该JMapViewer构造器实例的一个匿名实例DefaultMapController,就像这样:

public JMapViewer() {
    // other stuff
    new DefaultMapController(this);
}

在我看来,这是一个糟糕的设计选择,因为控制器具有大量的方法(选项,切换等-如下所示的示例),这些方法现在根本无法访问,那么它们有什么用?

public void setMovementMouseButton(int movementMouseButton) {
    // changes which mouse button is used to move the map
}

控制器确实具有对观众的引用,如上面的第一个代码片段所示,这就是它能够执行控制的方式。

但是,后来我想到了更奇怪的东西!如果该侦听器的匿名实例没有引用,为什么还可以生存?GC是否应该迅速销毁它?还是GC足够聪明,以至于知道引用实时消息的侦听器类也JComponent必须保持实时状态才能正常工作,即使由于某种奇怪的原因而没有名称也是如此?

因此,有两个实际问题:

为什么GC不销毁对象?
这确实是一个糟糕的设计选择,还是我不知道有什么方法可以从实例化查看器的类中访问控制器?我想为这个开源库做出贡献,而我的第一个更改想法是更改JMapViewer该类以使其具有引用其控制器的字段,并更改构造函数以将当前匿名控制器分配给该新字段。但是,我想确保我不会无所遗漏。我已经在整个代码库中搜索了text DefaultMapController,并且它仅出现在其自己的类定义中以及JMapViewer构造函数中的匿名实例中。

编辑:

确实确实存在一种通过使用java.awt.Component方法访问匿名侦听器的方法getMouseListeners()。因此,从技术上讲,在我的应用程序中,我可以在此html" target="_blank">集合中搜索的实例DefaultMapController,并使用该实例访问更改控制器选项所需的方法。

不过,要扮演魔鬼的拥护者,如果我坚持最初的想法,并给地图提供其控制器的参考,那么现在我有了一种循环参考(地图知道控制器,而控制器也知道地图)。这是一个坏主意吗?


问题答案:

抽象的父,JMapController拥有构造函数JMapViewer传递给它的引用DefaultMapController

public DefaultMapController(JMapViewer map) {
    super(map);
}

附录:map由控制器保存的参考用于(有选择地)将最多三个控制器参考加到地图上EventListenerList,在此进行讨论。这些中的任何一个都将排除GC。至少一个有益的设计好处是,具体JMapController只需实现可用的接口。

正如在此MVC大纲中所建议的那样,给视图提供对控制器的引用是不寻常的。与此相反,没有什么错,让控制器寄存器作为监听器的观点,所建议的在这里。

请注意,只有无参数JMapViewer构造函数会安装DefaultMapController。您可以使用替代构造函数,如的修订版29113中第57-59行的注释中所述Demo.java。这里检查一个完整的例子。



 类似资料:
  • 简而言之,主类是,它是的扩展。还有另一个非常重要的类,称为,它充当主类的。 我注意到的第一个奇怪的事情是查看器没有对控制器的引用。构造函数实例化的匿名实例,如下所示: 在我看来,这似乎是一个糟糕的设计选择,因为控制器有大量的方法(选项、切换等--如下所示的示例),这些方法现在根本无法访问,那么它们有什么好处呢? 然而,后来我想到了更奇怪的事情!如果监听器的这个匿名实例没有引用,为什么还允许它生存呢

  • 本文向大家介绍GC是什么? 为什么要有GC?相关面试题,主要包含被问及GC是什么? 为什么要有GC?时的应答技巧和注意事项,需要的朋友参考一下 答 GC(Garbage Collection) GC是垃圾收集器。程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一: 当程序需要更多的堆空间时,GC需要进行垃圾清理工作,暂停所有线程,找出所有无被引用的对象,进

  • 问题内容: 无论如何,要删除这样添加的事件侦听器: 不更换元素? 问题答案: 除非您在创建时存储了对事件处理程序的引用,否则无法彻底删除事件处理程序。 我通常会将它们添加到该页面上的主要对象中,然后在处理完该对象后可以对其进行迭代和清理。

  • 问题内容: 我有一个带有许多不同复选框和文本字段的JPanel,我有一个已禁用的按钮,并且在设置特定配置时需要将其启用。我需要的是整个JPanel上的侦听器,以在发生任何更改时查找事件。我相信我需要一个动作监听器,但找不到任何东西可以将动作监听器与JPanel桥接 我认为我可以将代码复制和粘贴很多次到面板中的每个侦听器中,但这对我来说似乎是不好的编码习惯。 问题答案: 首先在他的@Sage提意见一

  • 本文向大家介绍请问GC是什么? 还有为什么要有GC?相关面试题,主要包含被问及请问GC是什么? 还有为什么要有GC?时的应答技巧和注意事项,需要的朋友参考一下 考察点:回收 GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存

  • 问题内容: 为了使AngularJS在IE7和IE8中工作,我向ng-app元素添加了id =“ ng-app”和class =“ ng-app”: 过去一直如此,但是现在我将class =“ ng-app”添加到了两个不同的项目中,并且在这两个视图中不再在任何浏览器中呈现该视图。IE7 / 8兼容性的方式已更改吗?我正在使用CDN的1.0.2版本。 谢谢。 问题答案: 编辑说明: 添加docty