这种情况是否值得使用单例模式?

时间:2015-04-21 15:16:59

标签: java menu garbage-collection singleton heap

我正在创建一个迷你软件应用程序,如果你愿意,它会使用多个“菜单屏幕”。例如;主菜单屏幕,登录屏幕以及应用程序支持的所有不同功能的屏幕。我目前正在使用以下类处理此问题:

public class ScreenUpdater {

    public static void updateScreen(JPanel screen, JFrame frame) {

        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                frame.remove(frame.getContentPane().getComponent(0));
                frame.getContentPane().add(screen);
                frame.invalidate();
                frame.revalidate();
            }
        });

    }

}

静态方法updateScreen()采用以下参数:

  • 要在JFrame中显示的新屏幕(例如,新的LoginScreen(MainScreen mainScreenRef))(请注意,LoginScreen会引用主屏幕,因此它本身可以引用原始JFrame)。
  • 要在其中显示新屏幕的JFrame。

这对我来说效果很好,但是我注意到了一些我认为有问题的东西。例如,LoginScreen将在按下按钮时调出另一个屏幕,所有这些都将在按钮的被调用方法中发生,这使我相信即使没有显示LoginScreen,它仍然存在,并且对它有活动的引用。此外,在两次返回同一屏幕后,新实例将堆积起来,垃圾收集器无法处理先前的实例,因为它们在堆栈中较低。

为了解决这个问题,我相信Singleton设计模式可能会有用。

我对你们的问题都是(按重要性排序):

  • 我对这些实例的堆积是否正确?
  • 如果是这样,这是使用Singleton模式的理想情况还是有更好的解决方案?
  • 这种方法本身就是一种极差的方法吗?

非常感谢大家!

澄清 - 这就是我在提到垃圾收集问题时的意思。假设我们有一个名为LoginScreen()的类,其方法名为login()。方法login()实例化MainMenu()类,以便现在可以在JFrame中显示。在原始login()方法完成之前,将调用从MainMenu()类调用的所有方法。这使我相信垃圾收集器不会收集原始的LoginScreen()。

1 个答案:

答案 0 :(得分:2)

简短的回答是,不,这听起来不像是使用单身人士的理由。

你已经说过,你担心即使没有显示这些屏幕,你也会在这些屏幕上保留实例:是什么让你相信?如果您没有任何引用它们,那么它们将有资格进行垃圾收集。一旦方法退出,假设您没有对屏幕的任何其他引用,那么该对象将有资格进行垃圾收集。

然而,无论如何,所有这些听起来都像是CardLayout的工作。

如果您想了解更多信息,请发布MCVE