Недавно я обнаружил дополнение 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
дальнейшее чтение
Конечно, это обсуждалось миллионы раз раньше. Итак, вот несколько ссылок: