Этот вопрос проверяет понимание обработки отсутствующих данных в бизнес-логике приложения, что критично для устойчивости и предсказуемости сервисов.
Обработка null-значений в сервисном слое — это ключевой аспект проектирования устойчивых приложений. Сервисный слой содержит бизнес-логику, поэтому он должен гарантировать, что операции выполняются над валидными данными. Пропуск null в глубину системы может привести к NullPointerException, некорректным состояниям или повреждению данных.
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
public UserDto updateUserEmail(Long userId, String newEmail) {
// 1. Валидация входных параметров
if (userId == null) {
throw new IllegalArgumentException("User ID cannot be null");
}
// 2. Использование Optional для явной работы с возможным null
Optional<User> userOpt = userRepository.findById(userId);
if (userOpt.isEmpty()) {
throw new EntityNotFoundException("User not found with id: " + userId);
}
User user = userOpt.get();
// 3. Обработка newEmail: если null, оставляем старый
if (newEmail != null && !newEmail.isBlank()) {
user.setEmail(newEmail);
} // иначе — ничего не меняем, не бросаем исключение
User saved = userRepository.save(user);
return mapToDto(saved);
}
private UserDto mapToDto(User user) {
// 4. В DTO также можно предусмотреть обработку null полей
return UserDto.builder()
.id(user.getId())
.email(user.getEmail() != null ? user.getEmail() : "no-email")
.build();
}
}В этом примере показаны несколько техник: явная проверка аргументов, использование Optional для работы с репозиторием, условное обновление поля (если newEmail не null и не пустой) и предоставление значения по умолчанию при маппинге в DTO.
Такой подход универсален для любого сервис-ориентированного или многослойного приложения: веб-сервисы на Spring (Java/Kotlin), бэкенд на Node.js с Express, приложения на C# .NET. Важно согласовать стратегию в рамках всей команды: будут ли методы возвращать null, Optional или всегда бросать исключения.
Вывод: Единообразная обработка null в сервисном слое предотвращает ошибки времени выполнения и делает поведение системы предсказуемым. Используйте ранние проверки и явные обёртки (Optional) для обязательных параметров, а для опциональных — значения по умолчанию, если это соответствует бизнес-логике.