难道不将对象的实例分配给变量吗?

时间:2014-05-16 20:26:06

标签: java performance swing instantiation

好的,所以我现在已经进行了一些Java编程,偶尔我发现我需要创建一个对象的新实例,但我不需要该变量作为参考,例如使用GUI。当我使用GUI时,我会做这样的事情:

public class MainWindow extends JFrame {

    /**
     * Creates new form MainWindow
     */
    public MainWindow() {
        initComponents();
    }

    private void initComponents() {
        /*
         * Setup main properties of window 
         */
        JComponent contentPane = (JComponent)getContentPane();
        contentPane.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setJMenuBar(new MenuBar());
        setTitle("Window Title");
        setMaximumSize(new Dimension(1280, 720));
        setMinimumSize(new Dimension(1280, 720));
        setPreferredSize(new Dimension(1280, 720));
        setSize(1280, 720);
        setLocationRelativeTo(null);
        setResizable(false);

        //Add other stuff here

        setVisible(true);
    }
}

这样,每当我需要实例化GUI时,我只需要调用:

new MainWindow();

然而,我注意到Netbeans给了我一个关于此的提示,所以我知道这样做是不正确的做法。

话虽如此,当您不需要变量时,处理对象实例化的正确方法是什么?

3 个答案:

答案 0 :(得分:3)

您的对象未被任何其他对象引用,并且可能被垃圾收集。如果在应用程序中只需要一个实例,则可以在同一个类中使用静态方法来实现单例,如下所示(下面的代码尚未编译):

public class MainWindow extends JFrame {

    private static MainWindow instance;

    public static MainWindow getMainWindow() {
        if (instance == null) {
            instance = new MainWindow();
        }
        return instance;
    }

    /**
     * Creates new form MainWindow
     */
    private MainWindow() {
        initComponents();
    }

    private void initComponents() {
        // ... skip original code for brevity ...
    }
}

请注意,在这种情况下,您可以将构造函数设为私有。

编辑根据评论将实例更正为空比较。

答案 1 :(得分:2)

我不认为这是不好的做法;我同意Sotirios Delimanolis的说法:“如果你将它分配给一个你不使用的变量,这是更糟糕的做法。”

但我确实认为你可以做一些事情来使它更清晰,更容易维护。

  • 以描述其功能的方法将呼叫包裹到new ...。这使得在代码中清楚了解调用构造函数的意图。如果需要,它还可以在以后更改方式。

示例:

private void instantiateTheGui() {
    new MainWindow();
}
  • 我认为在构造函数中完成所有工作可能是个坏主意。该对象的每个用法是否都需要相同的属性?尺寸?能见度?等等。?我认为最后一行(setVisible(true);)至少应该被调用构造函数的代码调用,因为它可能不希望它立即可见。

现在你的代码突然变成了:

private void instantiateAndShowTheGui() {
    MainWindow window = new MainWindow();
    window.setVisible(true);
}

现在我们有一个变量,以及它的合法用法。我并没有试图得到一个变量,它发生在良好的设计和责任分离上。

我的观点是,调用对象构造函数而不将其存储在变量中没有任何内在错误,但我从未遇到(IMO)使用此模式的设计良好的代码。这不错,但 clean 代码通常不会遇到问题。

答案 2 :(得分:1)

创建这样的类是不好的做法,因为:

如果其他开发人员读取此代码(或您的未来 - 您),您可能不记得为什么会有这样的未使用过的对象。

我会重写像是一个像

这样的东西
new MainWindow().show();

show()会致电initComponent()