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