Конструктор 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 с наследованием, вы можете использовать эту технику.

Другие вопросы по тегам