У меня есть два строителя - 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 { ... }
А потом однажды я построю как мой строитель, я передам его в какой-то другой метод, и там я хочу, чтобы доступ ко всем поля с использованием геттеров. Итак, допустим, у меня есть PayloadA
, поэтому я отправлю для выполнения метода, как показано ниже, а затем в этом методе, я хочу извлечь все поля PayloadA
. Аналогично, если я отправлю PayloadB
для выполнения метода, я хочу извлечь все поля класса PayloadB
с использованием геттеров. Как я могу это сделать?
private void execute(Payload payload) {
// How can I access fields of PayloadA or PayloadB
// depending on what was passe
}
* но что должно быть материалом внутри моего абстрактного класса *, который является общим для обоих. –