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

标签 java menu garbage-collection singleton heap-memory

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

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 未显示,它仍然存在并具有对其的 Activity 引用。此外,两次返回同一屏幕后,新实例将堆积起来,垃圾收集器无法处理以前的实例,因为它们位于堆栈的较低位置。

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

我向大家提出的问题是(按重要性排序):

  • 我对这些实例的堆积的想法是否正确?
  • 如果是这样,这是使用单例模式的理想情况还是有更好的解决方案?
  • 这种方法本身是不是一种非常糟糕的方法?

提前非常感谢大家!

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

最佳答案

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

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

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

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

关于java - 这种情况是否值得使用单例模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29776371/

相关文章:

java - 无法让 Darkula 在 Netbeans 中以外观和感觉工作

java - 使用 java 访问 URL

css 无序列表菜单类似于 IE 中的 'steps'

Ruby 类对象垃圾回收

java - 为什么在给mvn clean程序包时出现此错误:找不到表?

java - 如何使用opencv编辑图像以使用OCR读取文本

Android和Honeycomb-如何在没有 "action bar"的情况下使用SDK 13设置菜单图标

javascript - 带 Subnav 的水平 CSS 菜单 - 设置事件选项卡

java - 在继承中,为子类创建一个对象时,是否也为它的父类(super class)创建了一个对象?

java - 为什么等待太久从年轻一代提升一个对象会导致效率低下?