Tengo clases llamadas digamos CalculationOutcome
y FileHashOutcome
. Sus constructores tienen (ActualResult, Throwable)
argumentos, y al final de una cadena de CompletionStage
s tengo handle(XxxOutcome::new)
.
Se podría hacer más clara las intenciones y ahorrar algo repetitivo si podía escribir por ejemplo PossiblyWithError<FileHash>
.
Editar: gente que pide, por ejemplo, el código ...
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
Para ser más específicos, es un actor dentro de Akka, y yo estoy pidiendo la infraestructura para tubería la parte posterior resultado en el actor como un mensaje.
Editar: sugerencias de que CompletableFuture
podría hacer el trabajo ... Sí, buen punto, que representa exactamente lo que necesita ser representado. Y es un poco de olor a código para implementar su propio áspera y listo futuro, entonces se envuelve en un futuro java8.
Hay algunos aros para saltar a través dependiendo de si usted tiene acceso a la "envoltura" del futuro. Si estás dentro de una thenApply
continuación que está "dentro" de la envolvente y que no lo saben. Y la infraestructura de Akka "tira a la basura" el sobre y sólo devuelve el resultado (y no devuelve nada si no fue una excepción, que es una de las razones principales por las que quería coger y envolver esa excepción al final de la CompletionStage
cadena). Por supuesto, ya he creado la CompletionStage, podía aferrarse a él en una variable miembro hasta que la infraestructura me dio un codazo que había completado.
Por @marstran, el nombre usual para esta clase es Try .
Scala tiene una clase tal en su biblioteca estándar: https://www.scala-lang.org/api/2.9.3/scala/util/Try.html
El mismo se puede hacer en Java, pero no es una parte de la biblioteca estándar: https://dzone.com/articles/why-try-better-exception-handling-in-java-with-try