私は2人のビルダー - PayloadA
とPayloadB
を持っています。例を簡単にするために、私は他の多くのフィールドを削除しました。Javaビルダークラスをサブクラス化する方法は?
PayloadA.Builder
コンストラクタは、入力パラメータとしてprocessName
、genericRecord
を取り、その後、genericRecord
からいくつかを抽出します。そしてその上で私は検証をしています。PayloadB.Builder
コンストラクタもprocessName
,genericRecord
を入力パラメータとし、上記と比較してgenericRecord
からわずかな異なるものを抽出します。そしてそれらの異なる分野で私は検証を行っています。
あなたが見ることができるように、これら2 Payload?.Builder
間の共通点はoldTimestamp
値、その後isValid
方法を抽出し、processName
、genericRecord
です。以下は
は私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
}
*私の抽象クラスの中に何があるべきでしょうか*両方のものに共通するもの –