我经常使用Supplier而我现在正在看新的番石榴10 Optional。
与供应商相比,可选保证永远不会返回null但会抛出IllegalStateException。此外,它是不可变的,因此一旦创建它就具有固定的已知值。与此相反,可以使用供应商创建通过调用get()触发的不同或惰性值(但不强制执行此操作)。
我跟着讨论为什么一个Optional不应该扩展供应商,我发现:
...it would not be a well-behaved Supplier
但我无法理解为什么,因为供应商明确指出: No guarantees are implied by this interface
对我来说它很合适,但似乎我过去常常以不同的方式雇用供应商。有人可以向我解释为什么不应该选择使用Optional作为供应商吗?
是:将Optional转换为供应商非常容易(此外,您可以选择改编的Supplier.get()是否将返回Optional.get()或Optional.orNull()) 但是你需要一些额外的转换,并且必须为每个转换创建新的对象: - (
似乎供应商的预期用途与我对其文档的理解存在一些不匹配。
迪特。
答案 0 :(得分:8)
考虑
的情况Supplier<String> s = Optional.absent();
想一想。你有一个包含一个方法的类型,它不带参数,但是程序员错误要调用该方法!这真的有意义吗?
您只需要“现有”选项的供应商,但是,只需使用Suppliers.ofInstance
。
答案 1 :(得分:6)
通常期望Supplier
能够返回对象(假设没有发生意外错误)。 Optional
明确可能无法返回对象。
我认为“此接口不暗示保证”通常意味着不能保证它如何检索对象,而不是接口根本不需要隐含检索对象的能力。即使您觉得Supplier
实例每次在其上调用get()
时都会抛出异常,但番石榴作者并不这么认为并且选择只提供可以预期的供应商一般表现得很好。