我有一个类,大致是这个样子的,它作为客户端的工厂,基于从凭证服务中检索的凭证。 它只构建一次客户端,并在每次调用时返回。
我看到的问题是构造函数中的第2行,它基本上开始使用依赖项“credentialService”立即初始化其他依赖项。如果其他开发人员移动构造函数中代码的顺序,它将开始失败。另一个选项是将方法
但是它存在线程安全问题。有没有更好的设计方式来避免我上面提到的问题?谢谢。
public class ClientFactory {
private CredentialService credentialService;
private ClientA clientA;
public ClientFactory(CredentialService credentialService){
this.credentialService = credentialService;
//initialization in constructor
this.clientA = buildClientA(credentialService.getCredentials());
}
public ClientA getClientA(){
return clientA;
}
/** Build new ClientA using crendentials*/
private ClientA buildClientA(String credentials){
return new ClientA(credentials);
}
}
我看到的问题是构造函数中的第2行,它基本上开始使用依赖项“credentialService”立即初始化其他依赖项。如果其他开发人员移动构造函数中代码的顺序,它将开始失败。另一个选项是将方法
getClientA()
更改为这样。 public ClientA getClientA(){
if(clientA == null) {
this.clientA = buildClientA(credentialService.getCredentials());
}
return clientA;
}
但是它存在线程安全问题。有没有更好的设计方式来避免我上面提到的问题?谢谢。
getClientA()
方法变为synchronized
吗? - Peter LawreygetClientA()
,它们都可以执行空值检查并创建ClientA
的不同实例。然后就会出现竞争条件来确定将返回/存储哪个实例。 - unholysamplersynchronized
也可以使用。我只是想知道在这种情况下是否可以应用某些单例模式。 - RandomQuestion