Обработка необязательного параметра, который не должен быть пустым

У меня есть следующий метод

private Invoice createInvoice(SomeParameter someParameter) {
    Invoice invoice = new Invoice();
    Optional<Customer> customer = customerRepository.findByCode(someParameter.getCustomerCode());
    invoice.Customer(resource.get());
    return this.createInvoice(...);
}

Я ищу клиента, который будет назначен счету-фактуре. Нет никаких шансов, что код клиента в параметре не существует в БД.

В любом случае, я знаю, что напрямую вызывать метод get() для необязательных значений — плохая практика, но все же я не хочу проверять, присутствует ли значение, это выглядит как какой-то шаблонный код. Есть и другие поля, такие как клиент, которые являются необязательными.

Есть ли лучший способ справиться с необязательным здесь?

Совсем без шансов? Что, если бы кто-то сделал someParameter.setCustomerCode(random.nextInt(9000))?

OneCricketeer 13.05.2022 03:16

Что такое resource? Этот метод должен быть бесконечно рекурсивным или this.createInvoice(...) вызывает перегрузку? Должен ли invoice.Customer(resource.get()); создавать объект Customer (потому что, если это так, вы просто его выбрасываете) или он вызывает метод (в этом случае вы должны использовать стандартные соглашения об именах Java и назвать метод customer)?

Slaw 13.05.2022 03:18

Один из способов избежать .get() — использовать customer.map().orElseThrow(), а затем обработать исключение и, возможно, сопоставить с записью Invoice. В любом случае вам все равно нужно получить значение необязательного

OneCricketeer 13.05.2022 03:19
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
72
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

There is no chance that the customer code in the parameter does not exist in the DB.

Если вы уверены, что результат присутствует в полученном вами необязательном объекте, то вместо get() вы должны вызвать orElseThrow(), который делает то же самое - извлекает значение (если имеется), но, в отличие от get(), явно показывает ваше намерение бросить NoSuchElementException, если необязательный объект не содержит результата.

У этого метода есть перегруженная версия, которая ожидает поставщика типа Throwable и позволяет предоставить желаемый тип исключения для случая пустого опционала.

И если OP хочет пользовательское исключение, они могут использовать Optional#orElseThrow(Supplier).

Slaw 13.05.2022 03:26

Если вы не хотите обрабатывать необязательный параметр, не возвращайте его из метода репозитория, просто верните объект Customer. Вы также можете аннотируйте свой метод репозитория с @Nullable, если это необходимо.

interface CustomerRepository extends Repository<Customer, Long> {

  Customer findByCode(...);                    
  // or
  @Nullable
  Customer findByCode(...);          

}
Ответ принят как подходящий
private Invoice createInvoice(SomeParameter someParameter) {
    Invoice invoice = new Invoice();
    Optional<Customer> customer = customerRepository.findByCode(someParameter.getCustomerCode());
    //1.invoice.Customer(resource.orElse(null));
    //2.resource.ifPresent(res->invoice.Customer(res));
    //3.invoice.Customer(resource.orElseThrow(()->new Exception("xxx")));
    return this.createInvoice(...);
}

Что вы хотите

Другие вопросы по теме