我有一个名为CalculationOutcome
和FileHashOutcome
的类。他们的构造函数有(ActualResult, Throwable)
参数,在CompletionStage
链的末尾,我有handle(XxxOutcome::new)
.
如果我能写PossiblyWithError<FileHash>
,它可能会使意图更清晰并节省一些样板。
编辑:人们要求示例代码...
class FileHashOutcome {
private final String hash;
private final Throwable throwable;
FileHashOutcome(String hash, Throwable throwable){
// Usual assignments
}
}
CompletionStage<FileHashOutcome> future =
SomeExternalLibrary.calculateHash(file)
// ...It's a CompletionStage<String> at this stage...
.handle(FileHashOutcome::new);
// Then I pass `future` to a service that
// will execute it and pass back the result asynchronously
具体来说,它位于 Akka actor 中,我要求基础设施将结果作为消息传送回 actor。
编辑:建议CompletableFuture
可以完成这项工作...是的,很好,它准确地代表了需要代表的内容。实现你自己的粗略和准备好的未来,然后将其包装在java8的未来,这有点代码的味道。
有一些箍需要跳过,这取决于您是否可以访问未来的"信封"。如果你在thenApply
里面,那么你就"在"信封里,你不知道。Akka基础设施"扔掉"信封,只返回结果(如果有异常,它什么也不返回,这也是我想在CompletionStage
链末端捕获并包装该异常的主要原因之一)。当然,由于我创建了 CompletionStage,我可以在成员变量中保留它,直到基础结构提示我它已完成。
根据@marstran,此类的常用名称是Try。
Scala在其标准库中有这样一个类:https://www.scala-lang.org/api/2.9.3/scala/util/Try.html
在Java中也可以这样做,但它不是标准库的一部分:https://dzone.com/articles/why-try-better-exception-handling-in-java-with-try