Как сделать тип возвращаемого значения обнуляемым с помощью необязательного и т.д.?

#java #spring #spring-boot #optional #dto

Вопрос:

У меня есть следующий метод, который возвращает DemoDTO , и если он не найден, возвращает исключение.

 public DemoDTO findShallowByUuid(UUID uuid) {  return demoRepository.findShallowByUuid(uuid)  .orElseThrow(() -gt; new EntityNotFoundException("Not found")); }  

Тем не менее, я хочу, чтобы метод возвращал значение null DemoDTO вместо того, чтобы выдавать ошибку. Для этой цели я преобразовал его тип и связанные типы возвращаемых данных в Optionallt;DemoDTOgt; или Optionallt;Tgt; , но это вызвало некоторые проблемы , связанные с соответствующим DTO. После того , как я обновил параметры конструктора Optionallt;Tgt; , другая часть приложения, которая использовала этот DTO, пожаловалась.

Я не уверен, что преобразование в Optionallt;Tgt; — хорошая идея или нет. Если это хорошая идея, должен ли я добавить в нее еще один конструктор DemoDTO ? Я не уверен, что это хорошее решение, так как оно также потребует некоторых изменений для типов свойств. Есть идеи?

Комментарии:

1. Что мешает вам изменить свой метод возврата Optional ? Нравится public Optionallt;DemoDTOgt; findShallowByUuid(UUID uuid) { return demoRepository.findShallowByUuid(uuid); }

2. Я попробовал, затем мне пришлось внести много изменений из-за необходимых изменений (преобразование в необязательное в DTO). Есть какие-нибудь предложения?

3. В принципе, изменение типа возвращаемого значения на Optional является хорошей идеей, потому что таким образом вы можете позволить вызывающему коду решать, что делать с «безрезультатным». Вызывающему не нужно выполнять попытку перехвата, чтобы выяснить, существует ли значение для данного UUID. Конечно, вам нужно изменить, вероятно, много кода. Еще одна возможность: ublic Optionallt;DemoDTOgt; findShallowByUuid(UUID uuid) { return demoRepository.findShallowByUuid(uuid).orElse(null); . Таким образом, вы избежите возникновения исключения, но вы вернетесь null , и вызывающий код должен проверить наличие null, чтобы не выдавать NullPointerExc

4. @jmizv Точно!.. Большое спасибо, очень элегантное решение 😉

Ответ №1:

Чтобы включить мой комментарий в ответ, это был бы самый элегантный способ, основанный на ваших требованиях:

 public DemoDTO findShallowByUuid(UUID uuid) {  return demoRepository.findShallowByUuid(uuid).orElse(null); }  

Но убедитесь, что вызывающий код правильно обрабатывает null , чтобы избежать NullPointerException s.

Комментарии:

1. Хранение в нем null разрушает всю идею необязательного типа, imo

2. Это правда, но мы ничего не храним null в an Optional .

3. На самом деле, невозможно хранить а null в Optional А.