Java 在反应流中的何处放置参数验证?
今天在办公室里,我的同事和我讨论了确保计算在反应流中以声明的方式进行的重要性,而不是迫不及待地、强制地在方法调用时进行 为了便于解释,让我举一个非常幼稚但具有说明性的例子。我们说过以下几点是错误的:Java 在反应流中的何处放置参数验证?,java,rx-java,rx-java2,project-reactor,reactive-streams,Java,Rx Java,Rx Java2,Project Reactor,Reactive Streams,今天在办公室里,我的同事和我讨论了确保计算在反应流中以声明的方式进行的重要性,而不是迫不及待地、强制地在方法调用时进行 为了便于解释,让我举一个非常幼稚但具有说明性的例子。我们说过以下几点是错误的: Single<Integer> getStream(String s) { Integer n = Integer.valueOf(s); return Single.just(n); } 但是这段代码将在getStream(“A”)中失败,我的流错误处理程序将永远无法访问
Single<Integer> getStream(String s) {
Integer n = Integer.valueOf(s);
return Single.just(n);
}
但是这段代码将在getStream(“A”)
中失败,我的流错误处理程序将永远无法访问。反应流方法的用户不希望对其调用执行try-catch,因为流提供了其他机制来处理错误,对吗
因此,我们建议我们应执行以下任一操作:
Single.defer(() -> Single.just(Integer.valueOf(s));
Single.fromCallable(() -> Integer.valueOf(s))
Sigle.create(subscriber -> { subscriber.onNext(Integer.valueOf(s)); }
但是,在下一次代码审查中,我发现了如下内容:
Single<Foo> getReactiveFoo(Bar bar, Baz baz, int price) {
return Single.fromCallable(() -> {
Objects.requireNonNull(bar, "bar should not be null");
Objects.requireNonNull(baz, "baz should not be null");
Preconditions.checkArgument(price > 0, "price should be > 0");
//...
});
}
我希望这不是一个固执己见的问题。我想了解被动流社区是否对我们应该如何准确处理此类异常以及它们属于声明性被动流还是命令式方法调用有意见
也许你可以建议我读一些关于这个主题的好例子或参考资料。我认为将这些验证视为先决条件是明智的,因此,不通过这些验证可能会被视为编程错误。这些应该失败得快,失败得难,所以在我看来,投掷的方法是可以的。这就是RxJava和Reactor所做的。查看RxJava在输入验证方面所做的工作:“因此,现在我发现这相当有趣,因为我一直认为,这种类型的NullPointerException、IllegalArgumentException、IndexOutOfBoundException等验证的目的是捕获程序员错误,我通常希望这些错误尽可能靠近错误的来源。当你抛出其中任何一个错误时,你肯定希望程序立即失败,并发出需要处理的错误的信号,我不介意它急切地失败,并尽可能靠近错误出现的地方。”同意。
Single<Foo> getReactiveFoo(Bar bar, Baz baz, int price) {
return Single.fromCallable(() -> {
Objects.requireNonNull(bar, "bar should not be null");
Objects.requireNonNull(baz, "baz should not be null");
Preconditions.checkArgument(price > 0, "price should be > 0");
//...
});
}
Single<Foo> getReactiveFoo(Bar bar, Baz baz, int price) {
Objects.requireNonNull(bar, "bar should not be null");
Objects.requireNonNull(baz, "baz should not be null");
Preconditions.checkArgument(price > 0, "price should be > 0");
return Single.fromCallable(() -> {
//...
});
}