java - 不将对象的实例分配给变量是不好的做法吗?

标签 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 就此给了我一个提示,所以我知道这样做是不正确的做法。

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

最佳答案

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

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 ...
    }
}

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

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

关于java - 不将对象的实例分配给变量是不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23704010/

相关文章:

c# - 了解多媒体计时器的奇怪行为

java - bignum 最快的实现是什么? (Java 的 bigInteger/Cython 的 int/gmpy/等等...)

mysql - 何时在MySQL中使用query_cache?

java - 旋转 Java Graphics2D 矩形?

java - 在 Swing 应用程序中保留键盘布局?

java - Apache Ignite 以编程方式销毁持久缓存

java.lang.IllegalArgumentException : cannot add to layout: constraint must be a string 异常

Java 反射获取父类(super class)得到意想不到的结果

java - Gson注解和Jackson注解能否共存于同一个POJO中?

java - JPanel/Graphics 方法paintComponent 是什么?