我最近发现了JDK 8中Optional
类型的添加。 Optional类型是避免NullPointerException
一种方法,因为从方法中获取Optional
返回值的API使用者被“强制”执行“在线”检查,以消耗其实际返回值。 更多细节可以在Javadoc中看到。 可以在此博客文章中找到非常有趣的进一步阅读,该文章比较了null
的一般概念以及在Java,SML和Ceylon中如何处理null
: http : //blog.informatech.cr/2013/04/10/ java-optional-objects。 图灵已经知道“空白”和“初始”状态。 有人可能会说, 巴贝基引擎需要“中立”或“零”状态,这可以追溯到1800年代的Lovelace。
另一方面,数学家也更喜欢将“无”与“空集”区分开来,“空集”是“内部没有任何东西的集” 。 例如,这与前面提到的Informatech博客文章中说明的和由Scala实现的“ NONE”和“ SOME”比较好。 无论如何,我已经考虑了Java的Optional
。 我真的不确定我是否会喜欢它,即使Java 9最终会在JLS中添加一些语法糖,类似于Ceylon的语法糖,以在语言级别使用Optional
。 由于Java是如此向后兼容,因此将不对现有的API进行任何改进以返回Optional
,例如,以下内容不会浮出水面的JDK 8:
public interface List<E> {Optional<E> get(int index);[...]
}
我们不仅可以将null
分配给Optional
变量,而且缺少“ Optional”也不能保证“ SOME”的语义,因为列表仍然会返回“裸” 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
}
因此……从我到Java的解决方案为-1
进一步阅读
当然,这已经被数百万次讨论过了。 因此,这里有几个链接:
- 在Java 8中不再有使用空引用的借口
- Java Posse用户组
- Lambda Dev邮件列表(可选!= @Nullable)
- Lambda Dev邮件列表(可选类只是一个值)
翻译自: https://www.javacodegeeks.com/2013/04/on-java-8s-introduction-of-optional.html