问题描述
|
在这里的特定情况下,
我有一个名为Usermanger的管理器,用于为用户处理CRUD
该经理是“ Singleton”,经过设计正确。
但是在更新方法中我有逻辑
public User update (User u)
{
// This line is problematic?
User u1 = new User();
copy(u,u1);
//Some logic
dao.update(u);
}
在单例管理器中创建任何新对象都会有问题吗?特别是对于非常并发的系统。
将
public User update (User u,User u1)
{
copy(u,u1);
//Some logic
dao.update(u);
}
解决我的问题?
解决方法
仅在单例方法内创建对象不会引起任何问题。毕竟,您不共享线程之间的任何状态。
如果您在单例内部存在状态,则可能会遇到问题-但是您所展示的只是创建一个局部变量,而不更改实例变量。方法的每次调用都有其自己完全独立的局部变量集。两个线程都可以执行相同的方法,但是它们不会看到彼此的局部变量。
,不,但是如果你把
User u1;
作为全局变量,将引起问题。
但是我有一个问题,为什么不这样编码?
public User update (User u)
{
//Some logic
User u = dao.update(u);
return u;
// OR return dao.update(u);
}
您无需在这里复制。在这种方法中,执行复制操作将需要为User对象分配2倍以上的内存。
,在不了解您的系统的情况下,我不得不打电话询问这里描述的设计模式。 Singleton和SomethingManager都是反模式。
您可能只需要考虑UserManager
的更具描述性的名称,但我强烈建议使用像Spring这样的IoC框架将其注入到需要的位置,而不是将其固定为\'global \'(本质上就是单身汉是)。