Поле insurance
для Car
всегда null
.Никогда не позволяйте Optional
быть null
, это отрицает саму идею наличия Optional
.И будет очень часто вызывать удивительные NullPointerException
.Это то, что происходит и в вашем коде.
Я предлагаю следующую версию класса Car
:
public static class Car {
private Insurance insurance = null;
public Optional<Insurance> getInsurance() {
return Optional.ofNullable(insurance);
}
}
Это устраняет проблему, поэтому вывод теперь такой:
Неизвестно
Нет смысла (что я вижу) в объявлении insurance
и Optional
.Достаточно того, что ваш получатель возвращает один.Optional
в основном для возвращаемых значений.У него мало других полезных применений.
РЕДАКТИРОВАТЬ: @chrylis прокомментировал и, похоже, не нравится комбинация простого ссылочного поля и получателя, возвращающего Optional
.Я не вижу в этом ничего плохого, но если вы предпочитаете оставить свое поле равным Optional
, как в вопросе, это, безусловно, возможно.Тогда вам просто нужно убедиться, что это не null
:
public static class Car {
private Optional<Insurance> insurance = Optional.empty();
public Optional<Insurance> getInsurance() {
return insurance;
}
}
Это также исправляет программу, поэтому мы получаем вывод выше.
Должен ли метод получения возвращатьOptional
обсуждается в этом вопросе: должен ли получатель Java 8 возвращать необязательный тип? Мой первый приведенный выше фрагмент, похоже, больше следует рекомендациям наименее одобренного ответа Марка .