У меня есть классы, которые называются скажем 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, и я прошу инфраструктуру трубка вернуть результат обратно в актор в виде сообщения.
Редактировать: предложения о том, что CompletableFuture
может выполнять эту работу... Да, хороший момент, он представляет именно то, что должно быть представлено. И это немного похоже на запах кода, чтобы реализовать свое собственное грубое и готовое будущее, а затем обернуть его в будущее java8.
Есть несколько обручей, через которые нужно прыгать в зависимости от того, есть ли у вас доступ к «конверту» будущего. Если вы внутри thenApply
, то вы «внутри» конверта и не знаете об этом. И инфраструктура Akka «выбрасывает» конверт и возвращает только результат (и ничего не возвращает, если было исключение, что является одной из основных причин, почему я хотел поймать и обернуть это исключение в конце цепочки CompletionStage
) . Конечно, поскольку я создал CompletionStage, я мог хранить его в переменной-члене, пока инфраструктура не подтолкнет меня к завершению.
Не совсем понятно, что вы хотите. Покажите какой-нибудь код, пожалуйста.
Я не знаю, о чем вы спрашиваете. Вы хотите передать эту вещь в качестве аргумента вместо Throwable? Если это так, просто используйте два конструктора, один из которых не принимает бросок.
Согласно @marstran, обычное имя этого класса — Пытаться.
В стандартной библиотеке 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
Это очень похоже на CompletableFuture. Или я что-то упускаю?
Нет, это не так, @VGR, CompletableFuture
делает все это, и даже лучше.
Эй, @VGR, заслуживает ли то, что ты говоришь, другого ответа на этот вопрос? - я думаю, может даже закончиться выбранным ответом.
Его нет в стандартной библиотеке, но обычное имя этого класса —
Try
.