Java 这种情况下是否需要使用单例模式?

Java 这种情况下是否需要使用单例模式?,java,menu,garbage-collection,singleton,heap,Java,Menu,Garbage Collection,Singleton,Heap,我正在创建一个微型软件应用程序,它使用多个“菜单屏幕”,如果你愿意的话。例如;主菜单屏幕、登录屏幕和应用程序支持的所有不同功能的屏幕。我目前正在使用以下类处理此问题: public class ScreenUpdater { public static void updateScreen(JPanel screen, JFrame frame) { SwingUtilities.invokeLater(new Runnable() { @Ov

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

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中的新屏幕(例如new LoginScreen(MainScreen mainScreenRef))(请注意,LoginScreen引用了主屏幕,因此它本身可以引用原始JFrame)
  • 将在其中显示新屏幕的JFrame
这对我来说很好,但是我注意到了一些我认为是问题的东西。例如,LoginScreen会在按下按钮时调用另一个屏幕,所有这些都会在按钮的调用方法中发生,这让我相信,即使LoginScreen没有显示,它仍然存在,并带有对它的活动引用。此外,在两次返回到同一屏幕时,新实例将堆积起来,垃圾收集器无法处理以前的实例,因为它们在堆栈中的位置较低

为了解决这个问题,我相信单例设计模式是有用的

我向各位提出的问题(按重要性排序):

  • 我对这些实例的堆积的想法正确吗
  • 如果是这样,这是使用单例模式的理想情况还是有更好的解决方案
  • 这种方法本身就是一种非常糟糕的方法吗
提前非常感谢大家


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

简单的回答是不,这听起来不像是使用singleton的理由

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

然而,所有这些听起来都像是CardLayout的工作


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

谢谢您的回答。我在问题末尾添加了一个更新。@quantum285,我的答案正确。方法调用的顺序实际上与某个对象是否符合垃圾收集条件无关。一旦该方法退出,假设您没有任何其他引用,那么它将有资格进行垃圾收集。不是顺序,而是层次结构。@quantum285,这仍然无关紧要。