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

时间:2018-11-16 23:40:20

标签: java swing singleton session-management

我正在使用 Singleton-like 类来操作会话,并使这些类易于引用。我有两个类延迟初始化的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 首先从 main()实例化,并在成功登录 Home < / strong>被初始化。

HomePage 类上,如果用户单击注销,则将其命名为:

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

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

P.S:Session类基本上不是Singleton

1 个答案:

答案 0 :(得分:1)

  

请告诉我这是否是一种好的方法

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

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

  1. Model-View-Controller

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

根据您的问题,您可以将模型“共享” /“暴露”给需要它的所有“视图”。此外,通过将基本模型定义为interface,可以减少耦合,并减少仅因为它们可以(并且您的设计允许它们执行)而执行视图不应该执行的视图的可能性。

  1. Dependency injection

这是通过参数说“通过”的奇特,奇特的方式。

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

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

同样,这就是使用interface减少耦合的地方,从而使API更加灵活且抗更改。

关于单身人士的话...

这是一个引发火焰大战的地区,可能具有决定性意义。

您应该查看Are Singletons Evil?以获得很多意见。

当心,有些人爱他们,有些人讨厌,我们其余的大多数人,我们只是继续编写代码并试图使我们的生活更轻松

作为“一般性”评论,需要非常非常谨慎地对待全球国家