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
Не правильно:
Правильно: