gpt4 book ai didi

java - 如何在单个构建器类中拥有多个构建器模式?

转载 作者:行者123 更新时间:2023-12-01 13:24:22 25 4
gpt4 key购买 nike

我有两种类型的有效载荷来自上游:要么是 PayloadAPayloadB .
PayloadA包含这么多字段:

createTimestamp
sentTimestamp
schemaId
eventId
producerId
guid
deviceId
langId
sessionId
PayloadB包含这么多字段:
createTimestamp
sentTimestamp
schemaId
eventId
producerId
eventType
payloadVersion
creationDate
expirationSeconds
payload

所以前 5 个字段在它们之间是通用的。一般来说,他们会有更多的领域。

我想为此创建一个线程安全的构建器模式。所以我应该有一个 Payload构建器模式类,其中包含来自两个有效负载的所有字段?或者我应该有 PayloadAPayloadB另一个内部的构建器模式类 Payload builder类和 PayloadA的常用字段和 PayloadB将成为 Payload 的一部分类(class)?

为此类问题制作构建器模式的最佳方法是什么。让我们说 PayloadA builder 模式 deviceId是必填字段。而对于 PayloadB builder 模式 eventType是必填字段。

最佳答案

我建议使用 static nested builder (item 2)模式在这里。

这是你可以做的

  • 创建 abstract类(class)Payload具有共同属性
  • 创建 PayloadAPayloadB其中扩展 Payload带有静态嵌套 Builder对于每个。
  • 让线程安全由使用/构造这些对象的方法处理(不需要 Builder 是线程安全的)。

  • Payload


    public abstract class Payload {

    private String createTimestamp;
    private String sentTimestamp;
    private String schemaId;
    private String eventId;
    private String producerId;

    //getters, setters, equals, hashcode, toString, compareTo, etc.
    }

    PayloadA (PayloadB would be similar)


    class PayloadA extends Payload {
    private String guid;
    private String deviceId;
    private String langId;
    private String sessionId;

    private PayloadA() {
    //avoid direct instantiation
    }

    public static class Builder {

    private String guid;
    private String deviceId;
    private String langId;
    private String sessionId;

    public Builder setLangId(String langId) {
    this.langId = langId;
    return this;
    }

    public Builder(String deviceId) {
    //validations
    this.deviceId = deviceId;
    }

    public PayloadA build() {
    //validations
    return new PayloadA();
    }

    //other setters returning this Builder
    }
    }

    Usage (construct the appropriate Payload from the upstream data


    public Payload constructPayload(final Data data) {

    //implement any thread safety mechanism as requirdhere.
    // synchronized is just for explanatory purposes
    synchronized (data) {
    if (data.getType().equals("PayloadA")) {
    return new PayloadA.Builder(data.getDeviceId())
    //.setGuid("someGuid")
    //other setters
    .build();
    } else {
    return new PayloadB.Builder(data.getEventType())
    //.setCreationDate("someCreationDate")
    // other setters
    .build();
    }
    }
    }

    希望这可以帮助。

    关于java - 如何在单个构建器类中拥有多个构建器模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40985991/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com