我使用类单例类来操作 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 首先从 main() 实例化,成功登录后,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
😱?
我想到了两个更好的解决方案......
这将代码层分成不同的功能组。
在您的问题的上下文中,您将向所有需要它的“ View ”“共享”/“公开”模型。此外,通过将基本模型定义为接口(interface),您可以减少耦合并减少 View 执行不应执行的操作的可能性,因为它们可以(并且您的设计允许它们执行)。 p>
这是一种通过参数“传递东西”的奇特而冒险的方式。
因此, View 不是从“集中”源(例如单例或创建和配置自己的实例)获取信息,而是通过构造函数或方法参数传递它们所需的所有信息。
使用 DI,可以更轻松地推断任何给定时间点的代码状态。它还使测试变得更简单,因为您不需要“准备”某些全局状态,而只需创建所需的对象(例如模拟)并将它们“注入(inject)”到代码中。
同样,这就是使用接口(interface)
可以减少耦合的地方,使 API 更加灵活且不易更改。
关于单例的一句话......
这是一个会引发激烈 war 的领域,而且可能具有决定性意义。
您应该看看Are Singletons Evil?征求意见。
请注意,有些人喜欢它们,有些人讨厌它们,剩下的大部分是我们,我们只是继续编写代码并努力让我们的生活更轻松😉
作为“一般”评论,需要非常非常小心地对待全局状态
关于java - Swing 应用程序一致性检查中的 session 管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53346769/