【发布时间】:2014-12-24 12:29:24
【问题描述】:
Listeners 等应该如何管理?我发现只有一个按钮等的例子。
我可以想到以下选项:
- 每个额外的类 - 似乎不正确,尤其是当项目 可以动态创建
- 每个组的类(例如form1, form2, controlButtonsOnLeft, controButtonsOnRight, mainMenu, userMenu, ...) 我将在其中检查哪个按钮/组件导致此问题 (例如通过 getSource 方法)
- 一些超(大)控制器, 它将接受所有用户操作
- 为每个新的匿名类, 它将调用控制器的方法并指定参数 详细信息(可能是枚举)
还有一个问题:我找到了很多 MVC 的例子,我想知道什么对 app.js 更好(或常用)。由 1 人开发(应用不会很大)?
A. Viewer 将监听器设置为控制器 (A1-3)
B.控制器调用查看器的方法,该方法接受监听器作为参数(方法 addLoginSubmitListener、addControlBoldButtonListener 等)
以上都可以实现,目前我会选择B4。 控制中的意义我会做这样的事情:
...
viewer.addLoginButtonListener(new Listener()
{
@Override
public void actionPerformed(ActionEvent e) {
...
someButtonsActionHandler(SomeButtonEnum, ActionEnum);
...
}
});
...
private void LoginActionHandler(LoginElementsEnum elem, ActionEnum action)
{
if (elem.equals(LOGINBUTTON)) {...}
...
}
...
这结合了可读的代码(1 个逻辑部分在代码的一个位置),不会创建任何不需要的冗余代码,不需要任何几乎动态的检查,易于重用等等。 你能确认/评论这个解决方案吗?
【问题讨论】:
-
当对监听器使用匿名实现时,您以后在处理对象时无法删除它们,这最终会(并且您将遇到这些情况)导致内存泄漏。
-
@alterfox:感谢指点。
-
@alterfox:这不是GC处理的吗?监听器列表是此类匿名监听器的唯一参考,它会在组件处理过程中被清空,对吧?又或者我理解错了。在这种情况下,我将为此创建一个类并为构造函数添加一个参数,该参数将决定哪个方法将处理它。 [也许有更好的解决方案,这是我想到的第一个]
-
例如B 开始监听 A。这意味着 B 的监听器出现在 A 的监听器列表中。后来,B被处置,A继续生活。监听器是强引用,阻止GC释放B的资源,所以需要去掉。这当然是如果监听器没有被构造成弱监听器,这就是另外一个话题了。
标签: java swing user-interface model-view-controller listeners