我有一个看起来像这样的类,它根据从凭据服务检索到的凭据充当客户端的工厂。它一次建立客户,并在每次呼叫时返回。

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。因此,初始化的顺序无关紧要。

顺便说一句,为了安全起见,避免混淆,我不会为构造函数和成员的参数使用相同的名称。

09-10 13:53
查看更多