junior
Что такое паттерн Builder?
Builder – паттерн, отделяющий конструирование сложного объекта от его представления, позволяя создавать объекты пошагово.
Аналогия из жизни: Builder – как конструктор бургера в приложении доставки. Вы выбираете булочку, котлету, соус и добавки шаг за шагом, а в конце нажимаете “Заказать” – и получаете готовый бургер.
Ручной Builder
public class HttpRequest {
private final String url;
private final String method;
private final Map<String, String> headers;
private final String body;
private HttpRequest(Builder builder) {
this.url = builder.url;
this.method = builder.method;
this.headers = Map.copyOf(builder.headers);
this.body = builder.body;
}
public static class Builder {
private final String url; // обязательный
private String method = "GET"; // по умолчанию
private final Map<String, String> headers = new HashMap<>();
private String body;
public Builder(String url) { this.url = url; }
public Builder method(String method) { this.method = method; return this; }
public Builder header(String key, String value) { headers.put(key, value); return this; }
public Builder body(String body) { this.body = body; return this; }
public HttpRequest build() {
if (url == null) throw new IllegalStateException("URL is required");
return new HttpRequest(this);
}
}
}
// Использование -- читаемо, невозможно забыть обязательные параметры
HttpRequest request = new HttpRequest.Builder("https://api.example.com")
.method("POST")
.header("Content-Type", "application/json")
.body("{\"name\": \"John\"}")
.build();
Пример
// Lombok @Builder -- генерирует Builder автоматически
@Builder
@Value // immutable
public class UserDto {
String name;
String email;
int age;
}
UserDto user = UserDto.builder()
.name("John")
.email("john@mail.com")
.age(30)
.build();
Важное
- Builder решает проблему “телескопического конструктора” (много параметров, часть optional)
- Объект, созданный Builder, обычно immutable
- Lombok
@Builder– стандарт в Spring-проектах для DTO
Частые ошибки
- Builder для объекта с 2 полями – over-engineering; достаточно конструктора или record
- Мутабельный объект после build() – Builder должен создавать immutable объект
- Повторное использование Builder – после build() Builder не должен использоваться повторно
Как используется в 2026
- Lombok
@Builder– повсеместно в Spring-проектах - Java Records – для простых DTO без Builder; Builder – для объектов с optional полями
- Fluent API в JDK:
HttpClient.newBuilder(),HttpRequest.newBuilder(),ProcessBuilder
На собеседовании: покажите, что понимаете, когда Builder нужен (много optional-параметров, immutable-объект), а когда избыточен (2-3 поля – достаточно record). Частая ошибка – не упомянуть Lombok и писать Builder вручную в 2026 году.