我有一个看起来像这样的类,它根据从凭据服务检索到的凭据充当客户端的工厂。它一次建立客户,并在每次呼叫时返回。
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;
}
但是它存在线程安全问题。有没有一种更好的方法可以避免上面我强调过的担忧?
谢谢
最佳答案
好,this.clientA = buildClientA(credentialService.getCredentials());
依赖于传递给构造函数的参数credentialService
,而不依赖于成员this.credentialService
。因此,初始化的顺序无关紧要。
顺便说一句,为了安全起见,避免混淆,我不会为构造函数和成员的参数使用相同的名称。