diff --git a/Bolts/src/main/java/bolts/Task.java b/Bolts/src/main/java/bolts/Task.java index b8e5a42..d49acdb 100644 --- a/Bolts/src/main/java/bolts/Task.java +++ b/Bolts/src/main/java/bolts/Task.java @@ -52,10 +52,21 @@ public class Task { private boolean cancelled; private TResult result; private Exception error; - private List> continuations; + private List> continuations = new ArrayList<>(); /* package */ Task() { - continuations = new ArrayList<>(); + } + + private Task(TResult result) { + trySetResult(result); + } + + private Task(boolean cancelled) { + if (cancelled) { + trySetCancelled(); + } else { + trySetResult(null); + } } /** @@ -128,6 +139,12 @@ public void waitForCompletion() throws InterruptedException { */ @SuppressWarnings("unchecked") public static Task forResult(TResult value) { + if (value == null) { + return (Task) TASK_NULL; + } + if (value instanceof Boolean) { + return (Task) ((Boolean) value ? TASK_TRUE : TASK_FALSE); + } bolts.TaskCompletionSource tcs = new bolts.TaskCompletionSource<>(); tcs.setResult(value); return tcs.getTask(); @@ -147,9 +164,7 @@ public static Task forError(Exception error) { */ @SuppressWarnings("unchecked") public static Task cancelled() { - bolts.TaskCompletionSource tcs = new bolts.TaskCompletionSource<>(); - tcs.setCancelled(); - return tcs.getTask(); + return (Task) TASK_CANCELLED; } /** @@ -924,4 +939,9 @@ public class TaskCompletionSource extends bolts.TaskCompletionSource { /* package */ TaskCompletionSource() { } } + + private static Task TASK_NULL = new Task<>(null); + private static Task TASK_TRUE = new Task<>((Boolean) true); + private static Task TASK_FALSE = new Task<>((Boolean) false); + private static Task TASK_CANCELLED = new Task(true); } diff --git a/Bolts/src/test/java/bolts/TaskTest.java b/Bolts/src/test/java/bolts/TaskTest.java index 6b09ad2..96b5e1e 100644 --- a/Bolts/src/test/java/bolts/TaskTest.java +++ b/Bolts/src/test/java/bolts/TaskTest.java @@ -24,6 +24,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; public class TaskTest { @@ -49,6 +50,18 @@ private void runTaskTest(Callable> callable) { } } + @Test + public void testCache() { + assertSame(Task.forResult(null), Task.forResult(null)); + Task trueTask = Task.forResult(true); + assertTrue(trueTask.getResult()); + assertSame(trueTask, Task.forResult(true)); + Task falseTask = Task.forResult(false); + assertFalse(falseTask.getResult()); + assertSame(falseTask, Task.forResult(false)); + assertSame(Task.cancelled(), Task.cancelled()); + } + @SuppressWarnings("ThrowableResultOfMethodCallIgnored") @Test public void testPrimitives() {