Построение Java-объектов по частям - PullRequest
0 голосов
/ 16 октября 2018

У меня сложный объект, который состоит из нескольких частей.Каждая часть требует выборки данных из другой службы (вызов REST).

public class Resource {
     int quantity;            // Service 1
     String name;             // Service 2
     Price price;             // Service 2, 3
     ...
}

public class Price {
     double value;              // Service 2
     String currency;           // Service 2
     int discount_percentage;   // Service 3
}

Я планирую использовать AbstractFactories и Java CompletableFuture для достижения того же.

Однако я не уверен, как я смогу это сделать - какие-либо предложения?

1 Ответ

0 голосов
/ 16 октября 2018

Пример ниже со строителем и CompletableFuture вместо AbstractFactory, но, возможно, помогает

public class Test {

    public static void main(String... args) {
        CompletableFuture<ComplexObject> completableFuture = CompletableFuture
                                                    .supplyAsync(()-> ComplexObject.builder())
                                                    .thenApply(cob -> cob.withComplexProp1(restService1.getDetails()))
                                                    .thenApply(cob -> cob.withComplexProp2(restService2.getDetails()))
                                                    .thenApply(cob -> cob.withComplexPropN(restServiceN.getDetails()))
                                                    .thenApply(cob -> cob.build());
        try {
            ComplexObject co = completableFuture.get();
        } catch (Exception e) {
            System.err.println("could not build the complex object");
        }
    }


}


class ComplexObject {
    private Object complexProp1;
    private Object complexProp2;
    private Object complexPropN;

    private ComplexObject() {}

    public static ComplexObjectBuilder builder() {
        return new ComplexObjectBuilder();
    }

    public static class ComplexObjectBuilder {

        private Object complexProp1;
        private Object complexProp2;
        private Object complexPropN;

        private ComplexObjectBuilder() {

        }

        public ComplexObjectBuilder withComplexProp1(Object complexProp1) {
            // process the received complexProp1 before setting it into the builder
            this.complexProp1 = complexProp1;
            return this;
        }
        public ComplexObjectBuilder withComplexProp2(Object complexProp1) {
            // process the received complexProp2 before setting it into the builder
            this.complexProp2 = complexProp2;
            return this;
        }
        public ComplexObjectBuilder withComplexPropN(Object complexProp1) {
            // process the received complexPropN before setting it into the builder
            this.complexPropN = complexPropN;
            return this;
        }

        public ComplexObject build() {
            ComplexObject co = new ComplexObject();
            co.complexProp1 = this.complexProp1;
            co.complexProp2 = this.complexProp2;
            co.complexPropN = this.complexPropN;
            return co;
        }
    }
}
...