Конструктор Lombok переопределяет конструктор по умолчанию
У меня есть сценарий ниже
Родительский класс:
@Getter
@Setter
public abstract class Record {
private String recordId;
}
Детский класс:
@Getter
@Setter
@ToString
@AllArgsConstructor
@Builder
public class SRecord extends Record {
private static final String RECORD_ID = "REC001";
private String street;
private String city;
public SRecord(){
setRecordId(RECORD_ID); //value of recordId being set
}
}
Я устанавливал значение recordId из дочерних классов, используя конструктор по умолчанию, и изначально не использовал lombok Builder. В конце концов я решил использовать здесь Builder, но проблема в том, что lombok Builder переопределяет мой конструктор по умолчанию, поэтому значение никогда не устанавливается.
Любые предложения, как я могу поставить любой крюк, чтобы lombok Builder использовал мой конструктор по умолчанию?
2 ответа
Ломбок @Builder
просто не использует конструктор по умолчанию. Он передает свои значения конструктору all-args, чтобы этот конструктор мог заполнить новый экземпляр этими значениями. @Builder
не использует сеттеры или прямой доступ к полям для этого. Так что ваш конструктор по умолчанию просто игнорируется @Builder
,
Что вы можете сделать, так это написать свой собственный конструктор all-args. В нем вы устанавливаете свое значение для recordId
и назначьте остальные поля из параметров.
Я думаю, что вы должны создать конструктор в вашем базовом классе:
@Getter
@Setter
public abstract class Record {
private String recordId;
public Record(String recordId) {
this.recordId = recordId;
}
}
Затем используйте его в конструкторе унаследованного класса:
@Getter
@Setter
@Builder
public class SRecord extends Record {
private static final String RECORD_ID = "REC001";
private String street;
private String city;
public SRecord(String street, String city) {
super(RECORD_ID);
this.street = street;
this.city = city;
}
}
PS Если вы хотите использовать Lombok Builder с наследованием, вы можете использовать эту технику.