В моем приложении я выполняю транзакцию, которая может находиться в трех разных состояниях в конце выполнения:
В зависимости от состояния клиент приложения может выполнять различные действия. В случае успеха они захотят получить результат транзакции (виджет). В случае сбоя они захотят получить причину ошибки. В случае, если транзакция находится в состоянии ожидания, они захотят запланировать время для повторной попытки. В настоящее время я возвращаю объект следующими методами:
public interface Result() {
State getState();
Widget getWidget(); // Success
Reason getFailureReason(); // Failure
Callable<Result> getTask(); // Pending
}
Идея состоит в том, что клиент проверяет состояние объекта результата и вызывает соответствующий метод в зависимости от его значения, например
if (result.getState() == State.PENDING) {
result.getTask();
}
Я думал, что вместо этого предпочтительнее использовать обратный вызов, например,
public interface TransactionCallback() {
void onFailure(Reason reason);
void onSuccess(Widget widget);
Delay onPending(Delay previous);
}
Где Delay
- это класс, представляющий TimeUnit и период, позволяющий приложению перепланировать выполнение транзакции. Другой альтернативой является создание исключения, заключающего в себе причину сбоя (поскольку оно должно произойти только в исключительных условиях), и сохранение методов onSuccess
и onPending
.
Так что мой вопрос к SO таков: является ли использование обратного вызова подходящим шаблоном для этой конкретной проблемы, или кто-нибудь может предложить что-то более подходящее?