Swing 应用程序一致性检查中的会话管理

Session Management in Swing application consistency check

我正在使用 Singleton-like class 来操作会话并使 classes 易于引用。我有两个 classes LockPage 和 HomePage,它们是 lazily initialized。我的 类单例 class 在这里:

public class Session{
private static LockPage lock;
private static HomePage homePage;

private Session() {

}
public static HomePage getHomePage() {
    if(homePage==null) {
        homePage = new HomePage();
    }
    return homePage;
}

public static LockPage getLockPage() {
    if(lock==null) {
        lock = new LockPage();
    }
    return lock;
}

public static void resetEverything() {
    lock=null;
    homePage = null;
}
}

LockPage 首先从 main() 实例化,在成功登录后,主页 初始化。

HomePage class 如果用户单击注销,将调用:

public void logOUt(){
    Session.getHomePage().disposeScreen();
    Session.resetEverything();
    Session.getLockPage();
}

我需要在其他几个 class 中使用主页 class,所以我认为这样引用可能会更好。请让我知道这是否是 好的方法 或者是否有更好的方法。

P.S: Session class 根本不是单例

Please let me know if this is a GOOD APPROACH

不,我认为不是。您将代码耦合到一个特定的实现,并公然将 API 的其他部分暴露给篡改,这超出了使用它们的 类 的责任......曾经有人打电话给 removeAll 在你的组件之前?

立即想到两个更好的解决方案...

  1. Model-View-Controller

这会将您的代码层分成不同的功能组。

在你的问题的上下文中,你会 "share"/"expose" 所有需要它的 "views" 模型。此外,通过将基本模型定义为 interface,您可以减少耦合并减少视图做它们不应该做的事情的可能性,只是因为它们可以(并且您的设计允许它们这样做)。

  1. Dependency injection

这是通过参数表达 "pass stuff" 的花哨的、花哨的方式。

因此,视图不是从 "centralised" 来源获取信息,例如单例或创建和配置它们自己的实例,而是通过构造函数或方法参数传递它们需要的所有信息。

使用 DI,可以更轻松地推断代码在任何给定时间点的状态。它还使测试更简单,因为您不需要 "prepare" 一些全局状态,而是只需将您需要的对象(例如模拟)和 "inject" 它们放入代码中。

同样,这是使用 interfaces 将减少耦合的地方,使 API 更加灵活和抗变化。

关于单例的一句话......

这是一个围绕其产生激烈战争的区域,它可能具有决定性意义。

你应该看看 Are Singletons Evil? 以获得一堆意见。

请注意,有些人喜欢它们,有些人讨厌它们,其余的大多数人,我们只是继续编写代码并努力让我们的生活更轻松

作为 "general" 评论,需要非常非常小心地对待全局状态