Optional
Optional
- контейнерный класс языка Java для представления значений, которых может не быть.
Если функция может вернуть null
, то ее значение всегда нужно оборачивать в Optional
. Это не только помогает убрать проблемы связанные с NPE, но и заставляет при моделировании более глубоко погружаться в предметную область. Задавать вопросы. В каких случаях может не быть этого значения? Что делать в этом месте, если значения нет?
При этом стоит придерживаться нескольких правил:
- Не использовать
Optional
как аргумент в функциях, использоватьOptional
для возврата значения из функций. - Не использовать
Optional
тип для полей классов. ВозвращатьOptional
в getter поля.
Правильно:
@Value
class User {
String firstName;
String middleName;
String lastName;
public Optional<String> getMiddleName() {
return Optional.ofNullable(this.middleName);
}
}
- Понимать разницу между
.orElse()
и.orElseGet()
.
.orElse()
- используем, если значение уже посчитано
.orElseGet()
- используем, если значение необходимо вычислить.
Не правильно:
Конструктор User будет вызван в любом случае, даже если значение Optional существует.
Правильно:
Конструктор User будет вызван только если не нашли подходящего пользователя.
-
Не использовать связку
Optional.isPresent()
-Optional.get()
там, где можно обойтись функциейOptional.ifPresent()
. -
Не увлекайтесь использованием Optional
Не правильно:
Правильно: