Статьи

На Java 8 введение опционально

Недавно я обнаружил дополнение JDK 8 Optionalтипа. Необязательный тип — это способ избежать NullPointerException, так как потребители API, которые получают Optionalвозвращаемые значения из методов, «вынуждены» выполнять проверки «присутствия», чтобы использовать их фактическое возвращаемое значение. Более подробную информацию можно увидеть в Javadoc .

Очень интересное дальнейшее прочтение можно увидеть здесь в этом сообщении в блоге, в котором сравниваются общие понятия nullи как nullобрабатываются в Java, SML и Ceylon:

http://blog.informatech.cr/2013/04/10/java-optional-objects

«Пустые» и «начальные» состояния были известны Тьюрингу . Можно также утверждать, что « Бэббидж Движок » требовал «нейтрального» или «нулевого» состояния , которое восходит к Аде Ловеласа в 1800-х годах.

С другой стороны, математики также предпочитают отличать «ничто» от «пустого множества», то есть «множества без ничего внутри» . Это хорошо согласуется с «НЕТ» и «НЕКОТОРЫМИ», как показано вышеупомянутым сообщением в блоге Informatech , и, например, реализовано Scala.

Во всяком случае, я Optionalнемного подумал о Java . Я действительно не уверен, понравится ли мне это, даже если Java 9 в конечном итоге добавит некоторый синтаксический сахар в JLS, который будет напоминать цейлонский для использования Optionalна уровне языка. Поскольку Java настолько невероятно обратно совместима (что я обычно нахожу очень хорошей вещью), ни один из существующих API-интерфейсов не будет модифицирован для возврата Optional, например, следующее не будет раскрывать JDK 8:

public interface List<E> {
    Optional<E> get(int index);
    [...]
}

Мало того, что мы относим nullк Optionalпеременному, но отсутствие «факультативный» не гарантирует семантику «некоторые», так как списки будут возвращать «обнаженное» nullзначение. Когда мы смешаем два способа мышления, мы получим две проверки вместо одной

Optional<T> optional = // [...]
T nonOptional = list.get(index);

// If we're paranoid, we'll double-check!
if (optional != null && optional.isPresent()) {
    // do stuff
}

// Here we probably can't trust the value
if (nonOptional != null) {
    // do stuff
}

Следовательно …

-1 от меня к решению Java

дальнейшее чтение

Конечно, это обсуждалось миллионы раз раньше. Итак, вот несколько ссылок: