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
在你的组件之前?
立即想到两个更好的解决方案...
这会将您的代码层分成不同的功能组。
在你的问题的上下文中,你会 "share"/"expose" 所有需要它的 "views" 模型。此外,通过将基本模型定义为 interface
,您可以减少耦合并减少视图做它们不应该做的事情的可能性,只是因为它们可以(并且您的设计允许它们这样做)。
- Dependency injection
这是通过参数表达 "pass stuff" 的花哨的、花哨的方式。
因此,视图不是从 "centralised" 来源获取信息,例如单例或创建和配置它们自己的实例,而是通过构造函数或方法参数传递它们需要的所有信息。
使用 DI,可以更轻松地推断代码在任何给定时间点的状态。它还使测试更简单,因为您不需要 "prepare" 一些全局状态,而是只需将您需要的对象(例如模拟)和 "inject" 它们放入代码中。
同样,这是使用 interface
s 将减少耦合的地方,使 API 更加灵活和抗变化。
关于单例的一句话......
这是一个围绕其产生激烈战争的区域,它可能具有决定性意义。
你应该看看 Are Singletons Evil? 以获得一堆意见。
请注意,有些人喜欢它们,有些人讨厌它们,其余的大多数人,我们只是继续编写代码并努力让我们的生活更轻松
作为 "general" 评论,需要非常非常小心地对待全局状态
我正在使用 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
在你的组件之前?
立即想到两个更好的解决方案...
这会将您的代码层分成不同的功能组。
在你的问题的上下文中,你会 "share"/"expose" 所有需要它的 "views" 模型。此外,通过将基本模型定义为 interface
,您可以减少耦合并减少视图做它们不应该做的事情的可能性,只是因为它们可以(并且您的设计允许它们这样做)。
- Dependency injection
这是通过参数表达 "pass stuff" 的花哨的、花哨的方式。
因此,视图不是从 "centralised" 来源获取信息,例如单例或创建和配置它们自己的实例,而是通过构造函数或方法参数传递它们需要的所有信息。
使用 DI,可以更轻松地推断代码在任何给定时间点的状态。它还使测试更简单,因为您不需要 "prepare" 一些全局状态,而是只需将您需要的对象(例如模拟)和 "inject" 它们放入代码中。
同样,这是使用 interface
s 将减少耦合的地方,使 API 更加灵活和抗变化。
关于单例的一句话......
这是一个围绕其产生激烈战争的区域,它可能具有决定性意义。
你应该看看 Are Singletons Evil? 以获得一堆意见。
请注意,有些人喜欢它们,有些人讨厌它们,其余的大多数人,我们只是继续编写代码并努力让我们的生活更轻松
作为 "general" 评论,需要非常非常小心地对待全局状态