Java GUI设计:使用对象还是使用方法?

时间:2014-05-01 06:52:29

标签: java object user-interface memory methods

我对Java中的GUI设计有一个noobie问题:我们应该使用更多方法还是更多对象?举一个非常简单的例子:对话框。

对于对话框,我可以使用方法或使用对象:

使用方法:

public static void MakeDialog() {
    final JFrame frame = new JFrame();
    String help = "";//Reader.readhelp();

    JTextArea contentArea = new JTextArea(help, 60, 60);
    JScrollPane scroller = new JScrollPane(contentArea);
    scroller.setPreferredSize(new Dimension (650,650));

    JButton close = new JButton("Close");
    close.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent a) {
            frame.dispose();
        }
    });

    JPanel panel = new JPanel();
    panel.add(scroller);
    panel.add(close);

    frame.add(panel);
    frame.setTitle("Help");
    frame.setSize(700, 700);
    frame.setVisible(true);
    frame.setResizable(false);
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}

然后我只需要调用此方法就需要显示此对话框。

但是,我可以采用另一种方法:制作一个对话框:

public class MyDialog {

     public MyDialog() {
           final JFrame frame = new JFrame();
    String help = "";//Reader.readhelp();

    JTextArea contentArea = new JTextArea(help, 60, 60);
    JScrollPane scroller = new JScrollPane(contentArea);
    scroller.setPreferredSize(new Dimension (650,650));

    JButton close = new JButton("Close");
    close.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent a) {
            frame.dispose();
        }
    });

    JPanel panel = new JPanel();
    panel.add(scroller);
    panel.add(close);

    frame.add(panel);
    frame.setTitle("Help");
    frame.setSize(700, 700);
    frame.setVisible(true);
    frame.setResizable(false);
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
     }
}

真正困扰我的问题是:哪一个更有效地使用内存?对于软件中的一个或两个对话框,这可能根本不是问题。如果我需要处理数百个对话框,我需要考虑可能消耗的内存资源。根据我到目前为止所学到的,调用该方法比创建MyDialog对象更好,因为一旦处理该方法,就会释放内存。但是,如果我不对其执行任何操作,则对象MyObject将保留在内存中。我面临的问题是:经过几个小时的开发,我发现我只剩下几MB的内存,我必须退出Eclipse并重新启动计算机以释放内存。

因此:

1)哪一个更好?

2)如果创建对象更好,如果我不再使用它,如何从内存中删除该对象?

2 个答案:

答案 0 :(得分:4)

内存使用与此无关。差异将是大约20个字节,这将是垃圾收集。

重要的是正确的设计。对象的构造函数不具有显示对话框等副作用。构造函数的目标是通过初始化其字段来创建具有特定状态的对象,以便稍后使用该对象。

你的例子并没有做那样的事情。您将创建一个MyDialog实例,并且不执行任何操作。所有构造函数都会产生巨大的副作用:显示一个对话框。

此设计中的另一个不好之处在于,您使用实例字段来存储实际上是常量的值,而不是绑定到任何特定的MyDialog实例,并且仅与构造函数相关。完全没有理由拥有这样的领域。

最后,您的方法并不尊重Java命名约定:方法以小写字母开头。它应该被命名为showDialog()而不是makeDialog,因为它不会创建一个对话框,但会显示一个对话框。

答案 1 :(得分:1)

我担心这个问题有点过于笼统,因为您要询问GUI设计的任何和所有用例。

让我来谈谈您提到的具体情况,即对话框。

令人惊讶的是,对于对话框而言,被认为是Swing的最佳实践,它位于方法和类之间。

在Swing中使用对话框时,一方面,最好的做法是为包含所有GUI的面板创建一个新类,它将成为对话框的内容窗格。另一方面,您应该创建一个将创建(并可能还显示)对话框的方法。在该方法中,您将执行以下操作:

  • 创建JDialog的实例(通常,不需要子类化)
  • 创建自定义面板类的实例(例如MyDialogContentPaneClass)
  • 将面板设置为对话框的内容窗格
  • 显示和/或返回对话框