我正在创建一个包含许多不同的库,这些库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);
}
}
现在这更好了,但是有一个问题是我不能有可选的返回类型,所以我可以在我的代码中浮动空值,并且应该在其他地方执行大量的空检查。
你有什么建议,怎么做?