java - 更好地设计构造函数中的初始化

标签 java oop

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

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;
   }

但是它有线程安全问题。有没有更好的方法来设计 above 类,避免我上面强调的问题?

谢谢

最佳答案

嗯,

this.clientA = buildClientA(credentialService.getCredentials()); 依赖传递给构造函数的参数 credentialService,而不是成员 this.credentialService 。因此,初始化的顺序无关紧要。

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

关于java - 更好地设计构造函数中的初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24944204/

相关文章:

java - 无法理解 java 中 Float.toHexString() 方法的 o/p

vb.net - 如何使用 vb.net 创建输出将采用分层结构的父子集合

java - 如何从自己的 validator 验证每个流程对象?

java - 如何克服这个错误 "SEVERE: A child container failed during start"??

java - 添加多种用户类型,每个用户都有不同的功能

oop - 为什么 Rust 不支持 trait 对象向上转换?

java - 这段代码示例中 static 有什么用?

java - SQL错误,当我在JAVA代码中实现加入

java - 出现错误 : JavaFX runtime components are missing,,需要在打开可执行 jar 时运行此应用程序

java - 使用包含数据的新 Array 或 ArrayList 调用父类(super class)的构造函数?