Ich habe zwei Builder - PayloadA
und PayloadB
. Um das Beispiel zu vereinfachen, habe ich viele andere Felder entfernt.Wie wird eine Java-Builder-Klasse abgeleitet?
PayloadA.Builder
KonstruktorprocessName
,genericRecord
als Eingabeparameter und extrahieren paar Dinge ausgenericRecord
. Und damit mache ich Validierung.PayloadB.Builder
Konstruktor nimmt auchprocessName
,genericRecord
als Eingabeparameter und extrahieren es einige verschiedene Dinge vongenericRecord
wie oben verglichen. Und auf diesen verschiedenen Gebieten mache ich Validierung.
Wie Sie sehen können, gemeinsame Sache zwischen diesen beiden Payload?.Builder
ist processName
, genericRecord
, oldTimestamp
Wert zu extrahieren und dann isValid
Methode.
Unten ist meine PayloadA
Klasse:
public final class PayloadA {
private final String clientId;
private final String deviceId;
private final String processName;
private final GenericRecord genericRecord;
private final Long oldTimestamp;
private PayloadA(Builder builder) {
this.clientId = builder.clientId;
this.deviceId = builder.deviceId;
this.processName = builder.processName;
this.genericRecord = builder.genericRecord;
this.oldTimestamp = builder.oldTimestamp;
}
public static class Builder {
private final String processName;
private final GenericRecord genericRecord;
private final String clientId;
private final String deviceId;
private final Long oldTimestamp;
public Builder(PayloadA payload) {
this.processName = payload.processName;
this.genericRecord = payload.genericRecord;
this.clientId = payload.clientId;
this.deviceId = payload.deviceId;
this.oldTimestamp = payload.oldTimestamp;
}
public Builder(String processName, GenericRecord genericRecord) {
this.processName = processName;
this.genericRecord = genericRecord;
this.clientId = (String) DataUtils.parse(genericRecord, "clientId");
this.deviceId = (String) DataUtils.parse(genericRecord, "deviceId");
this.oldTimestamp = (Long) DataUtils.parse(genericRecord, "oldTimestamp");
}
// calling this method to validate
public boolean isValid() {
return isValidClientIdDeviceId();
}
private boolean isValidClientIdDeviceId() {
// validate here
}
public PayloadA build() {
return new PayloadA(this);
}
}
// getter here
}
Unten ist meine PayloadB
Klasse:
public final class PayloadB {
private final GenericRecord genericRecord;
private final String processName;
private final String type;
private final String datumId;
private final Long oldTimestamp;
private PayloadB(Builder builder) {
this.processName = builder.processName;
this.genericRecord = builder.genericRecord;
this.type = builder.type;
this.datumId = builder.datumId;
this.oldTimestamp = builder.oldTimestamp;
}
public static class Builder {
private final GenericRecord genericRecord;
private final String processName;
private final String type;
private final String datumId;
private final Long oldTimestamp;
public Builder(PayloadB payload) {
this.processName = payload.processName;
this.genericRecord = payload.genericRecord;
this.type = payload.type;
this.datumId = payload.datumId;
this.oldTimestamp = payload.oldTimestamp;
}
public Builder(String processName, GenericRecord genericRecord) {
this.processName = processName;
this.genericRecord = genericRecord;
this.type = (String) DataUtils.parse(genericRecord, "type");
this.datumId = (String) DataUtils.parse(genericRecord, "datumId");
this.oldTimestamp = (Long) DataUtils.parse(genericRecord, "oldTimestamp");
}
// calling this method to validate
public boolean isValid() {
return isValidType() && isValidDatumId();
}
private boolean isValidType() {
// validate here
}
private boolean isValidDatumId() {
// validate here
}
public PayloadB build() {
return new PayloadB(this);
}
}
// getter here
}
Jetzt ist es eine Möglichkeit, die ich hier Begriff der abstrakten Klasse verwenden kann? Ich kann eine abstrakte Klasse Payload
erstellen, aber was soll das Zeug in meinem abstrakte Klasse sein:
public final class PayloadA extends Payload { ... }
public final class PayloadB extends Payload { ... }
Und dann, wenn ich meine beiden Baumeister bauen, werde ich es auf eine andere Methode übergeben und dort möchte ich alle für den Zugriff auf die Felder mit Gettern. Also lassen Sie uns sagen, ich habe Build PayloadA
, also werde ich senden, um die Methode wie unten gezeigt auszuführen und dann in dieser Methode möchte ich alle Felder von PayloadA
extrahieren. Ähnlich, wenn ich PayloadB
senden, um Methode auszuführen, dann möchte ich alle Felder von PayloadB
Klasse mit getters extrahieren. Wie kann ich das machen?
private void execute(Payload payload) {
// How can I access fields of PayloadA or PayloadB
// depending on what was passe
}
* aber was sollte das Zeug in meinem abstrakten Klasse * Zeug sein, die beide gemeinsam ist –