我正在使用 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
答案 0 :(得分:1)
请告诉我这是否是一种好的方法
不,我认为不是。您正在将代码耦合到特定的实现,并且公开地将API的其他部分暴露给篡改,这超出了使用它们的类的职责范围……以前有人在您的组件上调用过removeAll
吗?
想到两个立即更好的解决方案...
这会将您的代码层分成不同的功能组。
根据您的问题,您可以将模型“共享” /“暴露”给需要它的所有“视图”。此外,通过将基本模型定义为interface
,可以减少耦合,并减少仅因为它们可以(并且您的设计允许它们执行)而执行视图不应该执行的视图的可能性。
这是通过参数说“通过”的奇特,奇特的方式。
因此,而不是从“集中式”来源(例如单例或创建并配置自己的实例)获取信息的视图,而是通过构造函数或方法参数传递了他们所需的所有信息。
使用DI,可以更轻松地在任何给定的时间点推断代码的状态。这也使测试变得更简单,因为您不需要“准备”某些全局状态,而只需制作所需的对象(例如模拟对象)并将它们“注入”到代码中即可。
同样,这就是使用interface
减少耦合的地方,从而使API更加灵活且抗更改。
这是一个引发火焰大战的地区,可能具有决定性意义。
您应该查看Are Singletons Evil?以获得很多意见。
当心,有些人爱他们,有些人讨厌,我们其余的大多数人,我们只是继续编写代码并试图使我们的生活更轻松
作为“一般性”评论,需要非常非常谨慎地对待全球国家