我目前正在使用如下的类维护应用程序状态。它只有静态变量和静态方法
public class MyAppSession{
private MyAppSession(){ // private constructor}
private static UserProfile userProfile;
private static Enum appsessionMode;
private static List<UserProfile> guests ;
private static String host ;
public static UserProfile getUserProfile() {
return userProfile;
}
public static void setUserProfile(UserProfile userProfile) {
MyAppSession.userProfile = userProfile;
}
public static Enum getAppsessionMode() {
return appsessionMode;
}
public static void setAppsessionMode(Enum appsessionMode) {
MyAppSession.appsessionMode = appsessionMode;
}
...... other getters and setters
我正在使用这些静态方法和变量维护我的应用程序的会话。在我的应用程序中,我在许多类中使用类来识别我的应用程序的状态并处理业务逻辑。我还将根据用户操作更新会话。
在我的代码审查会议期间,我被要求删除静态,使其成为单例,并在所有依赖类中获取此对象的实例。
现在在静态的邪恶方面,我知道很难嘲笑这些。和未释放的静态变量的不同内存分配。
我想了解处理此类方案的最佳方法是什么?对于上述情况,实际上是否是静态矫枉过正?
答案 0 :(得分:1)
虽然它是开放的讨论,并取决于每个人的口味,我会说,走的路是一个依赖容器。它使测试变得更容易,并被认为是最佳实践。 Dependency Container遵循良好编程的伟大原则,并且是控制反转(IoC)的实现,其中依赖关系的控制从被调用的一个调用反转为一个调用。
对于某些方面,Singleton 被视为反模式。它实际上污染了全球范围。我曾经使用内置静态标识符的语言产生了同样的冲突,并且听到了一些改变了我的想法 - 不要使用它。您可以在没有 static 标识符的情况下执行所有操作,并且可以做得更好。只有当你完全掌握它 - 你可以稀疏地使用它。
一个警告:如果你计划一个简单的项目,你可能不会使用Dependency Container。您可以使用Singleton,Registry,Multiton甚至静态。但是这些都可能成为大型系统的严重缺陷,因为它们是反模式的。顺便说一句,你的静态实现实际上是某种Singleton的一个例子。