diff --git a/src/main/java/rx/Observable.java b/src/main/java/rx/Observable.java index 7acf3df8e0..f1c2f68284 100644 --- a/src/main/java/rx/Observable.java +++ b/src/main/java/rx/Observable.java @@ -15,13 +15,11 @@ import java.util.*; import java.util.concurrent.*; -import rx.annotations.Beta; -import rx.annotations.Experimental; +import rx.annotations.*; import rx.exceptions.*; import rx.functions.*; import rx.internal.operators.*; -import rx.internal.util.ScalarSynchronousObservable; -import rx.internal.util.UtilityFunctions; +import rx.internal.util.*; import rx.observables.*; import rx.observers.SafeSubscriber; import rx.plugins.*; @@ -1031,6 +1029,14 @@ public final static Observable defer(Func0> observableFacto return create(new OnSubscribeDefer(observableFactory)); } + /** An empty observable which just emits onCompleted to any subscriber. */ + private static final Observable EMPTY = create(new OnSubscribe() { + @Override + public void call(Subscriber t1) { + t1.onCompleted(); + } + }); + /** * Returns an Observable that emits no items to the {@link Observer} and immediately invokes its * {@link Observer#onCompleted onCompleted} method. @@ -1047,8 +1053,9 @@ public final static Observable defer(Func0> observableFacto * {@link Observer}'s {@link Observer#onCompleted() onCompleted} method * @see ReactiveX operators documentation: Empty */ + @SuppressWarnings("unchecked") public final static Observable empty() { - return from(Collections.emptyList()); + return (Observable)EMPTY; } /** diff --git a/src/test/java/rx/ObservableTests.java b/src/test/java/rx/ObservableTests.java index 41aa61645b..4c7f02ca06 100644 --- a/src/test/java/rx/ObservableTests.java +++ b/src/test/java/rx/ObservableTests.java @@ -1116,4 +1116,17 @@ public void testErrorThrownIssue1685() { System.out.println("Done"); } + @Test + public void testEmptyIdentity() { + assertEquals(Observable.empty(), Observable.empty()); + } + + @Test + public void testEmptyIsEmpty() { + Observable.empty().subscribe(w); + + verify(w).onCompleted(); + verify(w, never()).onNext(any(Integer.class)); + verify(w, never()).onError(any(Throwable.class)); + } }