Я следовал подходу, аналогичному описанному в других ответах, с некоторыми изменениями, основанными на моих требованиях, в основном я создал следующие классы (на всякий случай, все на языке Java):
public class Pair<L, R> {
final L left;
final R right;
public Pair(L left, R right) {
this.left = left;
this.right = right;
}
public <T> T get(Class<T> param) {
return (T) (param == this.left.getClass() ? this.left : this.right);
}
public static <L, R> Pair<L, R> of(L left, R right) {
return new Pair<L, R>(left, right);
}
}
Затем мое требование было простым: в классе репозитория, который достигает БД, для методов Get, которые извлекают данные из БД, мне нужно проверить, не удалось или не получилось, а затем, в случае успеха, мне нужно поиграть с возвращающимся списком. , если не удалось, остановите выполнение и сообщите об ошибке.
Так, например, мои методы такие:
public Pair<ResultMessage, List<Customer>> getCustomers() {
List<Customer> list = new ArrayList<Customer>();
try {
/*
* Do some work to get the list of Customers from the DB
* */
} catch (SQLException e) {
return Pair.of(
new ResultMessage(e.getErrorCode(), e.getMessage()), // Left
null); // Right
}
return Pair.of(
new ResultMessage(0, "SUCCESS"), // Left
list); // Right
}
Где ResultMessage - это просто класс с двумя полями (код / сообщение), а Customer - это любой класс с кучей полей, поступающих из БД.
Затем, чтобы проверить результат, я просто делаю это:
void doSomething(){
Pair<ResultMessage, List<Customer>> customerResult = _repository.getCustomers();
if (customerResult.get(ResultMessage.class).getCode() == 0) {
List<Customer> listOfCustomers = customerResult.get(List.class);
System.out.println("do SOMETHING with the list ;) ");
}else {
System.out.println("Raised Error... do nothing!");
}
}
List
ссылка и своего рода таблица поиска.