diff --git a/src/main/java/rx/Observable.java b/src/main/java/rx/Observable.java index 2d6e48eda2..38249d44e6 100644 --- a/src/main/java/rx/Observable.java +++ b/src/main/java/rx/Observable.java @@ -2295,7 +2295,7 @@ public final Observable> nest() { * @see ReactiveX operators documentation: Never */ public final static Observable never() { - return new NeverObservable(); + return NeverObservable.instance(); } /** @@ -4026,7 +4026,7 @@ public final Observable dematerialize() { * @see ReactiveX operators documentation: Distinct */ public final Observable distinct() { - return lift(new OperatorDistinct(UtilityFunctions.identity())); + return lift(OperatorDistinct. instance()); } /** @@ -4064,7 +4064,7 @@ public final Observable distinct(Func1 keySelecto * @see ReactiveX operators documentation: Distinct */ public final Observable distinctUntilChanged() { - return lift(new OperatorDistinctUntilChanged(UtilityFunctions.identity())); + return lift(OperatorDistinctUntilChanged. instance()); } /** @@ -4959,8 +4959,13 @@ public final Observable ignoreElements() { * @return an Observable that emits a Boolean * @see ReactiveX operators documentation: Contains */ + @SuppressWarnings("unchecked") public final Observable isEmpty() { - return lift(new OperatorAny(UtilityFunctions.alwaysTrue(), true)); + return lift((OperatorAny) HolderAnyForEmpty.INSTANCE); + } + + private static class HolderAnyForEmpty { + static final OperatorAny INSTANCE = new OperatorAny(UtilityFunctions.alwaysTrue(), true); } /** @@ -5226,7 +5231,7 @@ public final Boolean call(T t) { * @see ReactiveX operators documentation: backpressure operators */ public final Observable onBackpressureBuffer() { - return lift(new OperatorOnBackpressureBuffer()); + return lift(OperatorOnBackpressureBuffer. instance()); } /** @@ -6709,7 +6714,7 @@ public final Observable share() { * @see ReactiveX operators documentation: First */ public final Observable single() { - return lift(new OperatorSingle()); + return lift(OperatorSingle. instance()); } /** @@ -9276,7 +9281,22 @@ public final Observable zipWith(Observable other, Func2 * the type of item (not) emitted by the Observable */ private static class NeverObservable extends Observable { - public NeverObservable() { + + private static class Holder { + static final NeverObservable INSTANCE = new NeverObservable(); + } + + /** + * Returns a singleton instance of NeverObservble (cast to the generic type). + * + * @return + */ + @SuppressWarnings("unchecked") + static NeverObservable instance() { + return (NeverObservable) Holder.INSTANCE; + } + + NeverObservable() { super(new OnSubscribe() { @Override diff --git a/src/main/java/rx/internal/operators/OperatorDistinct.java b/src/main/java/rx/internal/operators/OperatorDistinct.java index f5cdba5bd5..b71738b7c1 100644 --- a/src/main/java/rx/internal/operators/OperatorDistinct.java +++ b/src/main/java/rx/internal/operators/OperatorDistinct.java @@ -17,9 +17,11 @@ import java.util.HashSet; import java.util.Set; + import rx.Observable.Operator; import rx.Subscriber; import rx.functions.Func1; +import rx.internal.util.UtilityFunctions; /** * Returns an Observable that emits all distinct items emitted by the source. @@ -29,6 +31,21 @@ */ public final class OperatorDistinct implements Operator { final Func1 keySelector; + + private static class Holder { + static final OperatorDistinct INSTANCE = new OperatorDistinct(UtilityFunctions.identity()); + } + + /** + * Returns a singleton instance of OperatorDistinct that was built using + * the identity function for comparison (new OperatorDistinct(UtilityFunctions.identity())). + * + * @return Operator that emits distinct values only (regardless of order) using the identity function for comparison + */ + @SuppressWarnings("unchecked") + public static OperatorDistinct instance() { + return (OperatorDistinct) Holder.INSTANCE; + } public OperatorDistinct(Func1 keySelector) { this.keySelector = keySelector; diff --git a/src/main/java/rx/internal/operators/OperatorDistinctUntilChanged.java b/src/main/java/rx/internal/operators/OperatorDistinctUntilChanged.java index dd59055776..275e33d0db 100644 --- a/src/main/java/rx/internal/operators/OperatorDistinctUntilChanged.java +++ b/src/main/java/rx/internal/operators/OperatorDistinctUntilChanged.java @@ -18,6 +18,7 @@ import rx.Observable.Operator; import rx.Subscriber; import rx.functions.Func1; +import rx.internal.util.UtilityFunctions; /** * Returns an Observable that emits all sequentially distinct items emitted by the source. @@ -26,6 +27,22 @@ */ public final class OperatorDistinctUntilChanged implements Operator { final Func1 keySelector; + + private static class Holder { + static final OperatorDistinctUntilChanged INSTANCE = new OperatorDistinctUntilChanged(UtilityFunctions.identity()); + } + + + /** + * Returns a singleton instance of OperatorDistinctUntilChanged that was built using + * the identity function for comparison (new OperatorDistinctUntilChanged(UtilityFunctions.identity())). + * + * @return Operator that emits sequentially distinct values only using the identity function for comparison + */ + @SuppressWarnings("unchecked") + public static OperatorDistinctUntilChanged instance() { + return (OperatorDistinctUntilChanged) Holder.INSTANCE; + } public OperatorDistinctUntilChanged(Func1 keySelector) { this.keySelector = keySelector; diff --git a/src/main/java/rx/internal/operators/OperatorOnBackpressureBuffer.java b/src/main/java/rx/internal/operators/OperatorOnBackpressureBuffer.java index e35c489d5c..cb39a53ef7 100644 --- a/src/main/java/rx/internal/operators/OperatorOnBackpressureBuffer.java +++ b/src/main/java/rx/internal/operators/OperatorOnBackpressureBuffer.java @@ -31,7 +31,16 @@ public class OperatorOnBackpressureBuffer implements Operator { private final Long capacity; private final Action0 onOverflow; - public OperatorOnBackpressureBuffer() { + private static class Holder { + static final OperatorOnBackpressureBuffer INSTANCE = new OperatorOnBackpressureBuffer(); + } + + @SuppressWarnings("unchecked") + public static OperatorOnBackpressureBuffer instance() { + return (OperatorOnBackpressureBuffer) Holder.INSTANCE; + } + + private OperatorOnBackpressureBuffer() { this.capacity = null; this.onOverflow = null; } diff --git a/src/main/java/rx/internal/operators/OperatorSingle.java b/src/main/java/rx/internal/operators/OperatorSingle.java index 7a400dd9be..53afca58c8 100644 --- a/src/main/java/rx/internal/operators/OperatorSingle.java +++ b/src/main/java/rx/internal/operators/OperatorSingle.java @@ -32,7 +32,22 @@ public final class OperatorSingle implements Operator { private final boolean hasDefaultValue; private final T defaultValue; - public OperatorSingle() { + private static class Holder { + final static OperatorSingle INSTANCE = new OperatorSingle(); + } + + /** + * Returns a singleton instance of OperatorSingle (if the stream is empty or has + * more than one element an error will be emitted) that is cast to the generic type. + * + * @return a singleton instance of an Operator that will emit a single value only unless the stream has zero or more than one element in which case it will emit an error. + */ + @SuppressWarnings("unchecked") + public static OperatorSingle instance() { + return (OperatorSingle) Holder.INSTANCE; + } + + private OperatorSingle() { this(false, null); }