[英]Using Supplier instead of Optional in the method parameter
我有一个接口,它的参数可以是null。
int count(@Nullable F filter);
为避免 null 参数和 null 检查常见的建议是使用方法重载:
int count();
int count(@NonNull F filter);
在某些情况下,我不喜欢这种方法,因为它迫使客户做这种工作:
F f = getFilter()
f != null ? count(f) : count()
客户端使用起来更方便:
count(getFilter())
Optional 乍一看可以解决这个问题,但参数https://rules.sonarsource.com/java/RSPEC-3553不应该使用“Optional”
所以我的问题是:我可以改用供应商吗?
//service code:
int count(Supplier<F> filter) {
Optional.ofNullable(filter.get()).map(f->count(f)).orElseGet(() -> count());
};
//client code:
count(() -> getFilter())
甚至
int count(Supplier<Optional<F>> filter)
Idea 没有显示任何警告。
在那之后我个人喜欢我的代码,但这不是作弊吗? 为什么它比可选的更好?
编辑:感谢您的评论。 我同意,就我而言,供应商只是一种复杂的 @Nullable 方法。
我将返回:
int count();
int count(@NonNull F filter);
/////
getFilter().map(f->count(f)).orElseGet(() -> count());
如果您不希望客户端代码使用null
拨号,您可以更改方法getFilter()
以返回Optional<F>
。
在这种情况下,客户端中的代码如下所示:
int count = getFilter().map(MyClass::count).orElse(MyClass.count());
使用这种方法,您的方法count(F)
不需要任何额外的逻辑。
如果感觉太复杂,那么可以以这样的方式实现count(F)
,如果提供的参数是null
,它将委托给count()
。
您对Supplier<F>
和Supplier<Optional<F>>
的尝试都是人为的,似乎是出于规避 Sonar 的意图,而不是真正的用例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.