我在宁静的项目中像下面那样设计了连接工厂类,但是在网上和stackoverflow中浏览了几篇文章后,对static关键字的用法感到困惑。请帮助我澄清我对此设计的怀疑,是好是坏。
public class ConnectionFactory{
public Connection lookupConnection(){
//lookup datasource from application server
return connection;
}
}
在我的REST资源类中,对通过ConnectionFactory对象获得的连接对象进行一些操作
@Path("/mypath")
public class RestSample{
public Response updateDetails(MyObj obj)
{
Connection conn=new ConnectionFactory().lookupConnection();
return conn.doSomeOperation();
}
}
我知道这在多线程环境中可以很好地工作,但是我是否不必要为每个请求创建ConnectionFactory对象?我应该改为将方法lookupConnection设为静态,并使用类名称ConnectionFactory进行引用,因为该方法未引用任何全局变量吗?当许多用户调用该服务时,这不会引起任何并发问题吗?
答案 0 :(得分:0)
您可以将lookupConnection声明为static
,我不希望这样做。
我希望使用一种称为Singleton的设计模式:
public class ConnectionFactory{
private ConnectionFactory conFactory;
//prevent instanciation from outside
private ConnectionFactory() {}
public static synchronized getFactory() {
if(ConnectionFactory.conFactory == null) { ConnectionFactory.conFactory = new ConnectionFactory(); }
return ConnectionFactory.conFactory;
}
//methods of object are non-static
}
此类是线程安全的。请注意synchronized
,您需要它,因为对象创建不是JVM中的原子操作。
通过从代码中的任何位置调用ConnectionFactory.getFactory()
来访问Factory。该方法将为您提供一个对象(如果尚未创建)。