Sobes.tech
Назад к вопросам
Junior — Middle
50

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