diff options
author | Matthias Villiger | 2019-08-26 09:29:09 +0000 |
---|---|---|
committer | Matthias Villiger | 2019-08-26 09:29:09 +0000 |
commit | b9d1080bcbac032dd92e50d5a4bcecdc9ae6542a (patch) | |
tree | 5df12f118fd404ead469f851be67f75bbccf20a4 /org.eclipse.scout.sdk.core.s/src/main/java/org/eclipse/scout/sdk/core/s/environment/Future.java | |
parent | fa72e93b20459e9622d4d09aad443be664ba25eb (diff) | |
download | org.eclipse.scout.sdk-b9d1080bcbac032dd92e50d5a4bcecdc9ae6542a.tar.gz org.eclipse.scout.sdk-b9d1080bcbac032dd92e50d5a4bcecdc9ae6542a.tar.xz org.eclipse.scout.sdk-b9d1080bcbac032dd92e50d5a4bcecdc9ae6542a.zip |
IFuture result computation should be lazy
The result computation of IFutures should only be performed if the client requests the result. If it just waits for the computation to complete, the result must not be computed. Therefore the result is always of type Supplier so that the computation of the supplier value is only performed on request and only once.
Diffstat (limited to 'org.eclipse.scout.sdk.core.s/src/main/java/org/eclipse/scout/sdk/core/s/environment/Future.java')
-rw-r--r-- | org.eclipse.scout.sdk.core.s/src/main/java/org/eclipse/scout/sdk/core/s/environment/Future.java | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/org.eclipse.scout.sdk.core.s/src/main/java/org/eclipse/scout/sdk/core/s/environment/Future.java b/org.eclipse.scout.sdk.core.s/src/main/java/org/eclipse/scout/sdk/core/s/environment/Future.java index 605b7dcb7..ffd1197db 100644 --- a/org.eclipse.scout.sdk.core.s/src/main/java/org/eclipse/scout/sdk/core/s/environment/Future.java +++ b/org.eclipse.scout.sdk.core.s/src/main/java/org/eclipse/scout/sdk/core/s/environment/Future.java @@ -16,13 +16,14 @@ import java.util.concurrent.CompletionException; import java.util.function.Supplier; import org.eclipse.scout.sdk.core.log.SdkLog; +import org.eclipse.scout.sdk.core.util.FinalValue; /** * <h3>{@link Future}</h3> * * @since 7.1.0 */ -public class Future<V> extends CompletableFuture<V> implements IFuture<V> { +public class Future<V> extends CompletableFuture<Supplier<V>> implements IFuture<V> { /** * Creates a completed {@link IFuture} with the specified result. @@ -93,10 +94,10 @@ public class Future<V> extends CompletableFuture<V> implements IFuture<V> { @Override public Future<V> awaitDoneThrowingOnError() { try { - result(); + join(); } catch (CancellationException e) { - SdkLog.debug("Canellation silently ignored", e); + SdkLog.debug("Cancellation silently ignored", e); } return this; } @@ -108,10 +109,11 @@ public class Future<V> extends CompletableFuture<V> implements IFuture<V> { else { if (error == null) { if (resultExtractor == null) { - complete(null); + complete(() -> null); // the supplier should never be null. only the result provided by the supplier may be null } else { - complete(resultExtractor.get()); + FinalValue<V> cachedResult = new FinalValue<>(); + complete(() -> cachedResult.computeIfAbsentAndGet(resultExtractor)); } } else { @@ -124,7 +126,7 @@ public class Future<V> extends CompletableFuture<V> implements IFuture<V> { @Override public V result() { try { - return join(); + return join().get(); } catch (CompletionException e) { SdkLog.debug("Future completed with errors.", e); |