我有兩個建設者 - PayloadA
和PayloadB
。爲了讓示例更簡單,我刪除了很多其他字段。如何繼承Java構建器類?
PayloadA.Builder
構造函數採用processName
,genericRecord
作爲輸入參數,然後從提取genericRecord
幾件事情。並且我正在進行驗證。PayloadB.Builder
構造函數也需要processName
,genericRecord
作爲輸入參數,然後從genericRecord
中提取幾個不同的東西,與上面相比。在這些不同的領域,我正在進行驗證。
正如你可以看到,這兩個Payload?.Builder
之間的共同點是processName
,genericRecord
,提取oldTimestamp
值,然後isValid
方法。
下面是我的PayloadA
類:
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
}
下面是我的PayloadB
類:
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
}
現在有沒有什麼辦法,我可以在這裏使用抽象類的概念?我可以創建一個抽象類Payload
但應該是什麼東西,我的抽象類中:
public final class PayloadA extends Payload { ... }
public final class PayloadB extends Payload { ... }
然後一旦我建我的兩個建設者,我將它傳遞給其他方法還有我要訪問的所有領域使用getters。因此,假設我已經構建了PayloadA
,因此我將發送以執行如下所示的方法,然後在該方法中,我想提取PayloadA
的所有字段。同樣,如果我發送PayloadB
來執行方法,那麼我想使用getter提取PayloadB
類的所有字段。我怎樣才能做到這一點?
private void execute(Payload payload) {
// How can I access fields of PayloadA or PayloadB
// depending on what was passe
}
*但是我的抽象類中的東西應該是什麼東西這是共同的兩個 –