Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用需要同时初始化的相关字段构造复杂对象_Java_Oop_Architecture_Software Design - Fatal编程技术网

Java 如何使用需要同时初始化的相关字段构造复杂对象

Java 如何使用需要同时初始化的相关字段构造复杂对象,java,oop,architecture,software-design,Java,Oop,Architecture,Software Design,我正在实现一个API,我不断遇到这个问题,我认为我的核心设计有问题,但我不确定是什么问题,我感觉被设计原则压倒了 基本上,我会有一个对象和一堆相关的字段。使用适当的信息填充字段是非常重要的,并且依赖于使用我传递给构造函数的客户端的一个或多个外部API调用,这些API调用还提供与多个字段相关的信息,因此需要同时填充多个字段。我想保持构造函数的简单/快速,并保持我的对象的可测试性,这样我就不会把任何逻辑放在那里,只需要赋值。然而,我最终要做的是创建一个方法来填充所有字段,并在空检查后在我的所有get

我正在实现一个API,我不断遇到这个问题,我认为我的核心设计有问题,但我不确定是什么问题,我感觉被设计原则压倒了

基本上,我会有一个对象和一堆相关的字段。使用适当的信息填充字段是非常重要的,并且依赖于使用我传递给构造函数的客户端的一个或多个外部API调用,这些API调用还提供与多个字段相关的信息,因此需要同时填充多个字段。我想保持构造函数的简单/快速,并保持我的对象的可测试性,这样我就不会把任何逻辑放在那里,只需要赋值。然而,我最终要做的是创建一个方法来填充所有字段,并在空检查后在我的所有getter中调用它,即惰性地填充对象字段

我认为这是不好的,因为它违反了“fail fast”原则,特别是因为我使用客户机调用外部服务,如果客户机凭据无效,外部服务可能会失败。但是,我在重新构造代码时遇到了问题

例如,我曾考虑将客户机逻辑提取到服务/连接器中,
ClothingConnector
,但我不确定这是否能解决我的问题,因为我仍然不想在构造函数中调用它,同时填充多个字段仍然是有益的

class Person {
    ClientToGetClothing clothingClient;

    Pants pants;
    Shirt shirt;
    Fabric shirtFabric;
    Fabric pantsFabric;

    public Person(ClientToGetClothing clothingClient) {
         this.clothingClient = clothingClient;
    }

    private void populateClothing() {
         PantsResponse pantsInfo = clothingClient.retrievePantsInfo();
         this.pants = pantsInfo.getPants();

         ShirtResponse shirtInfo = clothingClient.retrieveShirtInfo();
         this.shirt = pantsInfo.getShirt();

         // do some more things with my pants + shirt and assign results to more fields, calculate the fabric in this example

    }

    public Shirt getShirt() {
        if (shirt == null) {
            populateClothing;
        }
        return this.shirt;
    }
    // ...
}

首先,我要将ClothingClient与Person对象解耦。让工厂进行属性填充,然后返回person类。

为什么不事先从外部API获取所需的组件并将其传递给构造函数(&)?与a结合使用,可以生成可读性很好的代码。除此之外,这个问题似乎更适合于制造业。我认为这个操作对于工厂来说太复杂了,因此应该使用建筑商