Jaki jest najlepszy sposób na zbudowanie pełnej przyszłości w Javie? Zaimplementowałem własne CompletedFuture
poniżej, ale miałem nadzieję, że coś takiego już istnieje.
public class CompletedFuture<T> implements Future<T> {
private final T result;
public CompletedFuture(final T result) {
this.result = result;
}
@Override
public boolean cancel(final boolean b) {
return false;
}
@Override
public boolean isCancelled() {
return false;
}
@Override
public boolean isDone() {
return true;
}
@Override
public T get() throws InterruptedException, ExecutionException {
return this.result;
}
@Override
public T get(final long l, final TimeUnit timeUnit) throws InterruptedException, ExecutionException, TimeoutException {
return get();
}
}
Odpowiedzi:
Apache Commons Lang definiuje podobną implementację, która nazywa się ConstantFuture, możesz ją uzyskać, wywołując:
źródło
W Javie 8 możesz skorzystać z wbudowanego CompletableFuture:
źródło
isDone
zawsze zwraca prawdę. Dlatego jest to doskonała odpowiedź.Guawa definiuje
Futures.immediateFuture(value)
, który spełnia swoje zadanie.źródło
FutureTask<String> ft = new FutureTask<>(() -> "foo"); ft.run(); System.out.println(ft.get());
wypisze "foo";
Możesz również mieć Future, który zgłasza wyjątek, gdy wywoływana jest metoda get ():
FutureTask<String> ft = new FutureTask<>(() -> {throw new RuntimeException("exception!");}); ft.run();
źródło
Znalazłem bardzo podobną klasę do twojej w Java rt.jar
com.sun.xml.internal.ws.util.CompletedFuture
Pozwala również określić wyjątek, który może zostać wyrzucony po wywołaniu metody get (). Po prostu ustaw to na null, jeśli nie chcesz zgłaszać wyjątku.
źródło
com.sun.*
pakiecie nie jest dobrym pomysłem. Te klasy są ogólnie uważane za wewnętrzny szczegół implementacji i mogą ulec zmianie w różnych wersjach języka Java.W Javie 6 możesz użyć:
Promise<T> p = new Promise<T>(); p.resolve(value); return p.getFuture();
źródło