【问题标题】:One Listener instace for all components or an instance for each component所有组件的一个 Listener 实例或每个组件的一个实例
【发布时间】:2012-08-28 10:35:48
【问题描述】:

小问题

我想知道是否有关于为所有组件编写一个侦听器实例或为每个组件编写一个实例的良好实践建议。

扩展问题

我正在开发一个 java swing 应用程序。

在相同的形式中,我可以有十几个使用相同侦听器类的组件(它们之间没有关系)。我把我的每个听众都写在他们自己的班级里。

监听器用于对组件中引入的数据进行一些验证。

我应该为每个组件创建一个监听器类的实例,还是应该为所有组件使用相同的监听器实例。

除了this comment,我找不到任何关于此的好的实践建议,它没有指向任何参考。

【问题讨论】:

    标签: java swing


    【解决方案1】:

    你应该选择一个让你的代码可读和可维护的。

    如果创建实例更简单,请继续执行,但由于行为保持不变;我相信单实例应该可以工作。

    【讨论】:

      【解决方案2】:

      我认为最好的解决方案是让您的代码尽可能干净。

      基本上,如果只有一个实例不会使代码过于复杂,那么您可以只创建一个实例并在组件之间共享它。否则,您可以有多个实例。

      【讨论】:

        【解决方案3】:

        你的想法很有趣........

        如果它的 Swing 则移动......那么它已经基于 MVC 架构......

        Model - 业务逻辑和数据

        View - 输出表示

        Controller - 执行操作的位置。

        现在我认为最好还是有Business Logic with its data together,这样我们就可以轻松地将逻辑与其对应的数据关联起来。

        您始终可以为common EventSource 设置一个common listener,例如JButton...

        你可以有 4 个JButton,它们做不同的工作,现在你可以有一个ActionListenerswitch 语句.....很容易处理...... ..

        【讨论】:

          【解决方案4】:

          对于ActionListener 的特殊情况,使用Action 封装所需的功能。整个 Swing 中此类的宽 use 表明了它的价值。这个简单的example 说明了一些内置的文本组件操作;这个更详细的example 展示了如何在菜单和工具栏之间共享操作。

          替代方案是基于事件源的不断增长且难以维护的 if-then-else 阶梯。

          附录:啊,我看错了你的问题。 @Andrew 的comment 是关于;您的问题涉及实例。对于前者,单个听众倾向于向known anti-pattern 发展;引用的example 的早期版本说明了这个问题。对于后者,只使用所需数量的实例;我通常会在探查器中发现最严重的违规行为。

          【讨论】:

          • +1。这不是我一直在寻找的答案,但我不知道“行动”,而且看起来很有趣。谢谢
          • @FranciscoPuga:谢谢;我上面已经详细说明了。
          猜你喜欢
          • 2018-11-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-02
          • 2017-07-23
          • 2016-06-11
          相关资源
          最近更新 更多