当前位置: 首页 > 知识库问答 >
问题:

带有匿名EventListener的JPanel-为什么GC不破坏Listener?

轩辕奕
2023-03-14

简而言之,主类是JMapViewer,它是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不破坏对象?
  • 这确实是一个糟糕的设计选择,还是有某种我不知道的方法可以从实例化查看器的类访问控制器?

共有1个答案

岑光熙
2023-03-14

抽象父级JMapController保存对JMapViewer的引用,该引用由DefaultMapController构造函数传递到:

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

附录:控制器持有的map引用用于(有选择地)将最多三个控制器引用添加到映射的EventListenerList,这里将讨论这些引用。其中任何一个都将排除GC。至少一个有益的设计好处是,具体的JMapController只需要实现可用的接口。

正如本MVC大纲中所建议的那样,给视图一个对控制器的引用是不寻常的。相反,让控制器注册为视图的监听器并没有什么问题,就像这里建议的那样。

 类似资料:
  • 问题内容: 我一直在仔细阅读的开源代码。如果有人希望查看它,请检查SVN。 简而言之,主要类是,这是a的扩展JPanel。还有一个非常重要的类称为,它充当主要类的。 我注意到的第一个奇怪的事情是查看器没有对控制器的引用。该构造器实例的一个匿名实例,就像这样: 在我看来,这是一个糟糕的设计选择,因为控制器具有大量的方法(选项,切换等-如下所示的示例),这些方法现在根本无法访问,那么它们有什么用? 控

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

  • 本文向大家介绍请问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

  • 本文向大家介绍Minor Gc和Full GC 有什么不同呢? 相关面试题,主要包含被问及Minor Gc和Full GC 有什么不同呢? 时的应答技巧和注意事项,需要的朋友参考一下 新生代 GC(Minor GC):指发生新生代的的垃圾收集动作,Minor GC 非常频繁,回收速度一般也比较快。 老年代 GC(Major GC/Full GC):指发生在老年代的 GC,出现了 Major GC

  • 问题内容: 根据JLS: 15.9.5匿名类声明编译器会自动从类实例创建表达式派生匿名类声明。 匿名类从不抽象(第8.1.1.1节)。匿名类始终是内部类(第8.1.3节);它永远不是静态的(第8.1.1节,第8.5.2节)。 匿名类始终是隐式最终的(第8.1.1.2节) 。 这似乎是一个特定的设计决定,所以它有一定的历史。 如果我选择上这样的课: 如果选择的话,为什么不允许我再次对其进行子类化?