Рассмотрим выполнение вокруг идиомы .
Другой вариант (который на самом деле не так уж отличается, просто их больше разделяет) - выполнять каждую задачу в отдельном потоке.
Редактировать:
Вот что я имею в виду:
public interface LoadableDriver {
public String getName();
public void loadDriver() throws DriverException;
public void onError(Throwable e);
}
public class DriverLoader {
private Map<String, Exception> errors = new HashMap<String, Exception>();
public void load(LoadableDriver driver) {
try {
driver.loadDriver();
} catch (DriverException e) {
errors.put(driver.getName(), e);
driver.onError(e);
}
}
public Map<String, Exception> getErrors() { return errors; }
}
public class Main {
public void loadDrivers() {
DriverLoader loader = new DriverLoader();
loader.loadDriver(new LoadableDriver(){
public String getName() { return "SoundDriver"; }
public void loadDriver() { loadSoundDriver(); }
public void onError(Throwable e) { doSomethingA(); }
});
//etc. Or in the alternative make a real class that implements the interface for each driver.
Map<String, Exception> errors = loader.getErrors();
//react to any specific drivers that were not loaded and try again.
}
}
Редактировать: Это то, на что в конечном итоге выглядела бы чистая версия Java, если бы вы реализовали драйверы как классы (это то, что парадигма Java OO ожидала бы здесь, IMHO). Метод Main.loadDrivers () изменится следующим образом:
public void loadDrivers(LoadableDriver... drivers) {
DriverLoader loader = ...
for(LoadableDriver driver : drivers) {
loader.load(driver);
}
//retry code if you want.
Set<LoadableDriver> failures = loader.getErrors();
if(failures.size() > 0 && tries++ > MAX_TRIES) {
//log retrying and then:
loadDrivers(drivers.toArray(new LoadableDriver[0]));
}
}
Конечно, я больше не использую карту, потому что объекты будут самодостаточными (вы также можете избавиться от метода getName (), но, вероятно, следует переопределить toString ()), поэтому ошибки просто возвращаются в установить повторить попытку Вы могли бы сделать код повтора еще проще, если бы каждый драйвер знал, как часто он должен повторяться.
Java будет выглядеть не так хорошо, как хорошо сделанный шаблон C ++, но это выбор дизайна языка Java - предпочтение простоте, а не сложным функциям языка, которые могут усложнить поддержку кода с течением времени, если не будут выполнены должным образом.