java - Swing 应用程序一致性检查中的 session 管理

标签 java swing singleton session-management

我使用类单例类来操作 session 并使类可以轻松引用。我有两个类 LockPage 和 HomePage,它们是延迟初始化的。我的类单例类在这里:

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 首先从 ma​​in() 实例化,成功登录后,HomePage 被初始化。

HomePage类上,如果用户单击注销,则会调用:

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

我需要在其他几个类中使用 HomePage 类,因此我认为像这样的引用可能会更好。请告诉我这是否是一个好的方法或者是否有更好的方法。

P.S: Session 类本质上不是单例

最佳答案

Please let me know if this is a GOOD APPROACH

不,我认为不是。您将代码耦合到特定的实现,并公开地将 API 的其他部分暴露给篡改,这超出了使用它们的类的责任……之前有人在您的组件上调用过 removeAll 😱?

我想到了两个更好的解决方案......

  1. Model-View-Controller

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

在您的问题的上下文中,您将向所有需要它的“ View ”“共享”/“公开”模型。此外,通过将基本模型定义为接口(interface),您可以减少耦合并减少 View 执行不应执行的操作的可能性,因为它们可以(并且您的设计允许它们执行)。 p>

  • Dependency injection
  • 这是一种通过参数“传递东西”的奇特而冒险的方式。

    因此, View 不是从“集中”源(例如单例或创建和配置自己的实例)获取信息,而是通过构造函数或方法参数传递它们所需的所有信息。

    使用 DI,可以更轻松地推断任何给定时间点的代码状态。它还使测试变得更简单,因为您不需要“准备”某些全局状态,而只需创建所需的对象(例如模拟)并将它们“注入(inject)”到代码中。

    同样,这就是使用接口(interface)可以减少耦合的地方,使 API 更加灵活且不易更改。

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

    这是一个会引发激烈 war 的领域,而且可能具有决定性意义。

    您应该看看Are Singletons Evil?征求意见。

    请注意,有些人喜欢它们,有些人讨厌它们,剩下的大部分是我们,我们只是继续编写代码并努力让我们的生活更轻松😉

    作为“一般”评论,需要非常非常小心地对待全局状态

    关于java - Swing 应用程序一致性检查中的 session 管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53346769/

    相关文章:

    java - 如何在多个 JTextfield 上调用 `setText`?

    Java 双重检查锁定

    c# - 公共(public)静态 Dictionary<String,GameObject> 中的游戏对象在 Unity 中的场景更改时被销毁

    php - 扩展抽象单例类

    java gridlayout gui - 面板太多?

    java - 将 org.w3c.dom.Node 转换为字符串

    java - 如何使用纯java将wav转换为mp3?

    java - Math.random() 到底什么时候播种?

    java - TypedArray getColor 总是返回 defValue

    JAVA-我不想点击我的应用程序让其他应用程序失去焦点