Авторские права принадлежат автору Для любой формы перепечатки, пожалуйста, свяжитесь с автором для получения разрешения и укажите источник.
Введение
LombokВсе мы знаем, что в процессе использования POJO это приносит нам много удобства, экономя много времени при написании методов get, set, конструкторов, методов equal и toString. Кроме того, с помощью аннотации @Builder ломбок также может упростить шаблон построителя времени.
Просто определите статический общедоступный внутренний класс. Пример кода выглядит следующим образом:
public class User {
private Integer id;
private String name;
private String address;
private User() {
}
private User(User origin) {
this.id = origin.id;
this.name = origin.name;
this.address = origin.address;
}
public static class Builder {
private User target;
public Builder() {
this.target = new User();
}
public Builder id(Integer id) {
target.id = id;
return this;
}
public Builder name(String name) {
target.name = name;
return this;
}
public Builder address(String address) {
target.address = address;
return this;
}
public User build() {
return new User(target);
}
}
Если в проекте используется ломбок, вы можете напрямую использовать аннотацию @Builder для достижения
Измените приведенный выше класс следующим образом:
import lombok.Builder;
import lombok.ToString;
/**
* @author wulongtao
*/
@ToString
@Builder
public class UserExample {
private Integer id;
private String name;
private String address;
}
как пользоваться:
UserExample userExample = UserExample.builder()
.id(1)
.name("aaa")
.address("bbb")
.build();
System.out.println(userExample);
Столкнуться с проблемами
В процессе использования @Builder обнаружилась проблема: объект Builder подкласса не имеет свойств родительского класса. Это вызывало определенные проблемы в использовании.
Для этой проблемы было найдено следующее решение
- Для родительского класса используйте аннотацию @AllArgsConstructor.
- Для подклассов напишите конструктор с полными параметрами вручную, вызовите конструктор с полными параметрами родительского класса внутри и используйте аннотацию @Builder в конструкторе с полными параметрами подкласса.
Таким образом, объект Builder подкласса может использовать все частные свойства суперкласса.
Но это решение также имеет два побочных эффекта:
- потому что использовать
@AllArgsConstructor
Обратите внимание, порядок полей конструктора родительского класса определяется порядком объявленных полей.Если конструктор подкласса передает параметры в непоследовательном порядке, а типы полей все те же, найти ошибки будет сложно. - Если поле родительского класса увеличивается или уменьшается, конструкторы всех подклассов должны быть изменены
Хотя есть эти два побочных эффекта, это решение — единственный найденный мной способ решить проблему использования @Builder для подклассов, которые могут использовать свойства родительского класса.
Справочные комментарии в блоге:Аннотация и наследование Lombok @Builder
Как добавить значение поля по умолчанию в схему с помощью @Builder. Поскольку используется шаблон построителя, обычно недопустимо указывать значение поля по умолчанию при объявлении поля в классе, и вам нужно что-то делать с построителем.
- Настройте статический внутренний класс в качестве построителя, задайте значение по умолчанию, а затем используйте аннотацию @Builder.В это время ломбок завершит существующий класс построителя и будет использовать значение по умолчанию.
- Обновленный ломбок имеет объявление @Builder.Default, которое можно аннотировать в полях, требующих значений по умолчанию.
В комментариях также есть обсуждение побочных эффектов этого метода. Ссылка:Использование аннотации Lombok @Builder со значениями по умолчанию