【问题标题】:better way to implement inner class with listeners用监听器实现内部类的更好方法
【发布时间】:2013-04-12 00:04:08
【问题描述】:

我有一个带有内部类的主类。这是一个swing/GUI应用程序。

我有一些与 swing 相关的内部类,例如扩展 JPanel、JDialog 等...

在内部类中,我有匿名类,例如动作侦听器,我必须设置它们并从外部类获取数据..

例如,主类有内部类,而在内部类内部我有一个匿名侦听器类,例如:

public class Main extends JApplet {
 //etc...
  private class CTable extends JPanel {
      CDialog td;
      private JPopupMenu menu;
      public CTable(String title, AbstractTableModel tableModel) {
         //etc...
         menu = new JPopupMenu();
         JMenuItem menuItem = new JMenuItem("Test");
         menu.add(menuItem);
         //etc...
         menuItem.addActionListener(new ActionListener() {
           public void actionPerformed(ActionEvent event) {
              CTable.this.td = new CDialog("Test");
              CTable.this.td.setVisible(true);
           }
         });
     }

}

我唯一的问题只与像这样访问变量是否是好的做法有关:CTable.this.td = new CDialog("Test"); CTable.this.td.setVisible(true); ...来自匿名课程和关于不同实现策略/设计模式的建议。

【问题讨论】:

  • 就个人而言,我不喜欢这样做。我主要担心的是,如果有人扩展了您的课程并想要更改对话框的工作方式,会发生什么?从技术上讲,那里卡住了。来自主类的吸气剂将允许开发人员有机会改变这种行为,而无需尝试弄清楚如何改变你的内部类......是的,我不得不大摇大摆地复制代码只是这个问题 - MHO
  • 关于模块化的好处。

标签: java swing actionlistener anonymous


【解决方案1】:

我一直都知道匿名内部类是 Swing 的惯用语,但我从不喜欢它们。

就我个人而言,我认为监听器是控制器的一部分。我更喜欢 Swing 组件是纯视图,并让控制器实例化它们并为它们提供所需的侦听器,以作为 控制器 选择。不必让视图担心它如何与控制器通信或它所在的位置。

【讨论】:

  • 谢谢,我会接受你的 MVC 回答,但其他建议也很棒。太糟糕了,stackoverflow 不允许“接受”多个答案
【解决方案2】:
CTable.this.td.setVisible(true);

有一个规则叫做Law of demeter。这表明您应该只直接访问类。通过跨多个对象来获得所需的方法,您正在类之间创建tight coupling,这使得将来更改单个类变得更加困难。

我建议的设计模式可能是Proxy class。代理类充当两个类之间的缓冲区,这意味着两个类通过Proxy class 相互通信

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多