假设我有一个这样的库方法(非常缩写):
public static <V> Optional<V> doSomethingWith(Callable<V> callable) {
try {
return Optional.of(callable.call());
} catch (Exception ex) {
// Do something with ex
return Optional.empty();
}
}
我想要一种不返回值的东西,例如:
Library.</*What1*/>doSomethingWith(() -> {
foo();
return /*what2*/;
});
我对不返回值的泛型方法的第一个直觉是创建类型Void
并返回null
,但是由于将结果包装在中,Optional
这将引发异常。
什么是合理的占位符,/*What1*/
并且/*what2*/
看起来不像Integer
和完全随机0
?
[edit]我试图避免,Optional.ofNullable
因为此处使用空表示callable.call()
未正常完成。
我通常用Boolean.TRUE
标记成功来表示,但是您也可以返回Void.class
。从并非每次返回都会创建要丢弃的新对象的意义上来说,两者都是廉价的。尽管Class<Void>
不仅如此,Void
它也可以用于标记某些东西的目的void
。
如前所述,您还可以创建自己的Result-class / -enum。
或者,您当然也可以返回Optional.<Void>nothing()
。这会导致一些问题Optional<Optional<Void>>
,但也能解决问题。
如果您认为以上所有内容都很丑陋,我担心该API可能不适用于您的需求。提出问题/拉动请求或寻找其他东西。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句