为什么Optional不会扩展供应商

Dit*_*itz 2 guava

我经常使用供应商,现在我正在寻找新的Guava 10 Optional.

与供应商相比,可选保证永远不会返回null,而是抛出IllegalStateException.此外,它是不可变的,因此一旦创建它就具有固定的已知值.与此相反,可以使用供应商创建通过调用get()触发的不同或惰性值(但不强制执行此操作).

我跟着讨论为什么一个Optional不应该扩展供应商,我发现:

......它不会是一个表现良好的供应商

但我无法理解为什么,正如供应商明确指出的那样: 此接口不暗示任何保证.

对我来说它很合适,但似乎我过去常常以不同的方式雇用供应商.有人可以向我解释为什么不应该选择使用Optional作为供应商?

是的:将Optional转换为供应商非常容易(此外,您可以选择是否适应的Supplier.get()将返回Optional.get()或Optional.orNull()),但您需要进行一些额外的转换并拥有为每个创建新对象:-(

似乎供应商的预期用途与我对其文档的理解之间存在一些不匹配.

迪特.

Kev*_*ion 8

考虑一下这种情况

Supplier<String> s = Optional.absent();
Run Code Online (Sandbox Code Playgroud)

想想这个.你有一个包含一个方法的类型,它不带任何参数,但是为了调用该方法是一个程序员错误!这真的有意义吗?

您只需要"现有"选项的供应商,但是,只需使用Suppliers.ofInstance.


Col*_*inD 6

Supplier通常期望A 能够返回对象(假设没有发生意外错误).一个Optional明确可能无法返回对象的东西.

我认为"这个接口没有暗示保证"通常意味着不能保证它如何检索对象,而不是接口根本不需要隐含检索对象的能力.即使您觉得Supplier每次调用get()它时实例都可以抛出异常,但是Guava的作者并不这么认为并且只选择提供可以预期通常表现良好的供应商.