繁体   English   中英

在方法参数中使用 Supplier 而不是 Optional

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM