1

我正在创建一个包含许多不同的库,这些库NetworkMessages通常采用 JSON 格式,现在需要一个相应的 Java 模型。

问题是这些消息可以很容易地在 JSON 中包含大约 100 个字段。其中一些是强制性的(30%),一些是可选的(70%)

所以我最关心的是如何最小化相应模型中的样板代码。因为,就像我说的,那些 POJO 很容易有大约 100 个字段,还有那么多 getter,以及构造函数中的那么多字段。

我将举一个小的例子Message,但请记住,消息通常要大得多(更多字段)。

消息A.java

@JsonInclude(Include.NON_EMPTY)
public class MessageA extends NetworkMessage {

    private final String a;

    private final String b;

    private final String c;

    private final String d;

    private final String e;

    private final String f;

    private final String g;

    private final String h;

    private final String i;

    private final String j;

    private final String k;

    @JsonCreator
    private MessageA(
            // required fields
            @JsonProperty(value = "a", required = true) String a, 
            @JsonProperty(value = "b", required = true) String b,
            @JsonProperty(value = "c", required = true) String c,
            @JsonProperty(value = "d", required = true) String d, 
            @JsonProperty(value = "e", required = true) String e, 
            @JsonProperty(value = "f", required = true) String f,

            // optional fields
            @JsonProperty(value = "g") String g, 
            @JsonProperty(value = "h") String h, 
            @JsonProperty(value = "i") String i, 
            @JsonProperty(value = "j") String j,
            @JsonProperty(value = "k") String k) {

        this.a = a;
        this.b = b;
        this.c = c;
        this.d = d;
        this.e = e;
        this.f = f;
        this.g = g;
        this.h = h;
        this.i = i;
        this.j = j;
        this.k = k;
    }

    public Optional<String> getG() {
        return Optional.ofNullable(g);
    }

    public Optional<String> getH() {
        return Optional.ofNullable(h);
    }

    public Optional<String> getI() {
        return Optional.ofNullable(i);
    }

    public Optional<MessageType> getJ() {
        return Optional.ofNullable(j);
    }

    public Optional<String> getK() {
        return Optional.ofNullable(k);
    }

    public String getA() {
        return a;
    }

    public String getB() {
        return b;
    }

    public String getC() {
        return c;
    }

    public String getD() {
        return d;
    }

    public String getE() {
        return e;
    }

    public String getF() {
        return f;
    }
}

现在,我尝试通过使用 Google 的AutoValue库来解决其中的一些问题,然后代码看起来好一点,但仍然调用了具有许多字段的构造函数。

消息A.java

@AutoValue
@JsonInclude(Include.NON_EMPTY)
public abstract class MessageA extends NetworkMessage {

    // required fields
    @Nonnull public abstract String getFieldA();

    @Nonnull public abstract String getFieldB();

    @Nonnull public abstract String getFieldC();

    @Nonnull public abstract String getFieldD();

    @Nonnull public abstract String getFieldE();

    @Nonnull public abstract String getFieldF();

    // optional fields
    @Nullable public abstract String getFieldG();

    @Nullable public abstract String getFieldH();

    @Nullable public abstract String getFieldI();

    @Nullable public abstract String getFieldJ();

    @Nullable public abstract String getFieldK();

    @JsonCreator
    private static MessageA create(
              // required fields
              @JsonProperty(value = "a", required = true) String a,
              @JsonProperty(value = "b", required = true) String b,
            @JsonProperty(value = "c", required = true) String c,
            @JsonProperty(value = "d", required = true) String d,
            @JsonProperty(value = "e", required = true) String e,
            @JsonProperty(value = "f", required = true) String f,

            // optional fields
            @JsonProperty(value = "g") String g,
            @JsonProperty(value = "h") String h,
            @JsonProperty(value = "i") String i,
            @JsonProperty(value = "j") String j,
            @JsonProperty(value = "k") String k) {

        return new AutoValue_MessageA(
                a, b, c, d, e, f, g, h, I, j, k);
    }
}

现在这更好了,但是有一个问题是我不能有可选的返回类型,所以我可以在我的代码中浮动空值,并且应该在其他地方执行大量的空检查。

你有什么建议,怎么做?

4

1 回答 1

0

如果您真的想要/需要将这些 Json 消息表示为 POJO,您至少可以通过仅定义所需的字段并使用Lombok生成 getter/setter/Ctor 来解决所有样板 getter/setter/Ctor 噪音。通过使用@Data @Data注释类,您将免费获得 getters/setter/ctor,而无需看到所涉及的样板。

@Data
public class MessageA extends NetworkMessage {

private final String a;

会导致一个看起来像这样(以及更多)的类

@Data
public class MessageA extends NetworkMessage {

private final String a;
public MessageA(String a){
  this.a=a;
}
public String getA(){
  return this.a;
}

/*
*No setter since the field is private
*public void setA(String a){
*  this.a=a;
*}

*public boolean equals(Object o){...}
*public String toString(){...}
*/

我一直在使用 lombok 来避免一些必要的混乱。

但也许你最好完全避免这些数据类。如此庞大的消息看起来不像是代表一个概念,而是代表几个嵌套的概念。否则,只需将 JSON 存储为 JSONObject 并提供直接从 JSON 获取值的 getter(您将更容易以这种方式配置/验证复杂条件)

于 2017-12-15T13:39:03.893 回答