Каким образом можно связать новый объект данных (DTO), который нельзя изменить, с существующим DTO?
Ответ от нейросети
sobes.tech AI
Что хотят услышать интервьюеры:
Обычно новый неизменяемый DTO связывают с существующим через композицию: добавляют ссылку на уже готовый DTO или включают его поля в новый объект на этапе маппинга. Если нужен строгий контракт, используют обёртку/агрегацию или builder/factory для создания нового DTO на основе старого. Главное — не пытаться «дописывать» immutable-объект после создания.
Определение:
DTO связывают друг с другом как данные, а не как поведение: один DTO может содержать другой DTO в поле, либо быть построен из него копированием нужных значений. Если объект неизменяемый, его состояние задаётся только в конструкторе или через фабрику, поэтому связь устанавливается при создании нового экземпляра. Это позволяет безопасно переиспользовать данные без нарушения immutability.
Пример использования:
Например, есть UserDto и нужно добавить к нему данные профиля в UserWithProfileDto. Новый DTO создаётся на основе старого и содержит его как вложенное поле.
public record UserDto(Long id, String name) {}
public record ProfileDto(String city, String phone) {}
public record UserWithProfileDto(UserDto user, ProfileDto profile) {
public static UserWithProfileDto from(UserDto user, ProfileDto profile) {
return new UserWithProfileDto(user, profile);
}
}
// использование
UserDto user = new UserDto(1L, "Ivan");
ProfileDto profile = new ProfileDto("Moscow", "+7-999-123-45-67");
UserWithProfileDto dto = UserWithProfileDto.from(user, profile);
Пояснение кода:
Код показывает два immutable DTO в виде record, что удобно для неизменяемых данных. Затем создаётся третий DTO, который связывает первые два через поля user и profile. Метод from(...) — это простой фабричный способ собрать новый объект из существующих данных без изменения исходных DTO. Такой подход сохраняет неизменяемость и делает структуру данных прозрачной.
Ключевые моменты:
- Immutable DTO нельзя “связать” через изменение состояния после создания — только через новый объект.
- Самый частый способ — композиция: один DTO хранит ссылку на другой DTO.
- Если нужно изменить представление данных, делают маппинг в новый DTO через конструктор, factory или builder.
- Для immutable-структур важно задавать все связи сразу при создании экземпляра.
- Такой подход упрощает потокобезопасность, тестирование и предсказуемость данных.