Я дотримувався аналогічного підходу, ніж описаний в інших відповідях, за допомогою декількох налаштувань, виходячи з вимоги, яку я висунув, я в основному створив наступні класи (про всяк випадок, все на 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);
}
}
Тоді моя вимога була простою, в класі сховища, що доходить до БД, для методів отримання, ніж отримання даних з БД, мені потрібно перевірити, чи не вдалося це чи вдалося, тоді, якщо вдасться, мені потрібно було грати зі списком, що повертається , якщо не вдалося, зупиніть виконання та повідомте про помилку.
Наприклад, наприклад, мої методи такі:
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
довідка і така собі таблиця пошуку.