Class MaybeSubject<T>

java.lang.Object
io.reactivex.rxjava3.core.Maybe<T>
io.reactivex.rxjava3.subjects.MaybeSubject<T>
Type Parameters:
T - the value type received and emitted
All Implemented Interfaces:
MaybeObserver<T>, MaybeSource<T>

public final class MaybeSubject<T> extends Maybe<T> implements MaybeObserver<T>
Represents a hot Maybe-like source and consumer of events similar to Subjects.

This subject does not have a public constructor by design; a new non-terminated instance of this MaybeSubject can be created via the create() method.

Since the MaybeSubject is conceptionally derived from the Processor type in the Reactive Streams specification, nulls are not allowed (Rule 2.13) as parameters to onSuccess(Object) and onError(Throwable). Such calls will result in a NullPointerException being thrown and the subject's state is not changed.

Since a MaybeSubject is a Maybe, calling onSuccess, onError or onComplete will move this MaybeSubject into its terminal state atomically.

All methods are thread safe. Calling onSuccess(Object) or onComplete() multiple times has no effect. Calling onError(Throwable) multiple times relays the Throwable to the RxJavaPlugins.onError(Throwable) global error handler.

Even though MaybeSubject implements the MaybeObserver interface, calling onSubscribe is not required (Rule 2.12) if the subject is used as a standalone source. However, calling onSubscribe after the MaybeSubject reached its terminal state will result in the given Disposable being disposed immediately.

This MaybeSubject supports the standard state-peeking methods hasComplete(), hasThrowable(), getThrowable() and hasObservers() as well as means to read any success item in a non-blocking and thread-safe manner via hasValue() and getValue().

The MaybeSubject does not support clearing its cached onSuccess value.

Scheduler:
MaybeSubject does not operate by default on a particular Scheduler and the MaybeObservers get notified on the thread where the terminating onSuccess, onError or onComplete methods were invoked.
Error handling:
When the onError(Throwable) is called, the MaybeSubject enters into a terminal state and emits the same Throwable instance to the last set of MaybeObservers. During this emission, if one or more MaybeObservers dispose their respective Disposables, the Throwable is delivered to the global error handler via RxJavaPlugins.onError(Throwable) (multiple times if multiple MaybeObservers cancel at once). If there were no MaybeObservers subscribed to this MaybeSubject when the onError() was called, the global error handler is not invoked.

Example usage:


 MaybeSubject<Integer> subject1 = MaybeSubject.create();

 TestObserver<Integer> to1 = subject1.test();

 // MaybeSubjects are empty by default
 to1.assertEmpty();

 subject1.onSuccess(1);

 // onSuccess is a terminal event with MaybeSubjects
 // TestObserver converts onSuccess into onNext + onComplete
 to1.assertResult(1);

 TestObserver<Integer> to2 = subject1.test();

 // late Observers receive the terminal signal (onSuccess) too
 to2.assertResult(1);

 // -----------------------------------------------------

 MaybeSubject<Integer> subject2 = MaybeSubject.create();

 TestObserver<Integer> to3 = subject2.test();

 subject2.onComplete();

 // a completed MaybeSubject completes its MaybeObservers
 to3.assertResult();

 TestObserver<Integer> to4 = subject1.test();

 // late Observers receive the terminal signal (onComplete) too
 to4.assertResult();
 

History: 2.0.5 - experimental

Since:
2.1
  • Field Details

  • Constructor Details

    • MaybeSubject

      MaybeSubject()
  • Method Details

    • create

      @CheckReturnValue @NonNull public static <T> @NonNull MaybeSubject<T> create()
      Creates a fresh MaybeSubject.
      Type Parameters:
      T - the value type received and emitted
      Returns:
      the new MaybeSubject instance
    • onSubscribe

      public void onSubscribe(Disposable d)
      Description copied from interface: MaybeObserver
      Provides the MaybeObserver with the means of cancelling (disposing) the connection (channel) with the Maybe in both synchronous (from within onSubscribe(Disposable) itself) and asynchronous manner.
      Specified by:
      onSubscribe in interface MaybeObserver<T>
      Parameters:
      d - the Disposable instance whose Disposable.dispose() can be called anytime to cancel the connection
    • onSuccess

      public void onSuccess(T value)
      Description copied from interface: MaybeObserver
      Notifies the MaybeObserver with one item and that the Maybe has finished sending push-based notifications.

      The Maybe will not call this method if it calls MaybeObserver.onError(java.lang.Throwable).

      Specified by:
      onSuccess in interface MaybeObserver<T>
      Parameters:
      value - the item emitted by the Maybe
    • onError

      public void onError(Throwable e)
      Description copied from interface: MaybeObserver
      Notifies the MaybeObserver that the Maybe has experienced an error condition.

      If the Maybe calls this method, it will not thereafter call MaybeObserver.onSuccess(T).

      Specified by:
      onError in interface MaybeObserver<T>
      Parameters:
      e - the exception encountered by the Maybe
    • onComplete

      public void onComplete()
      Description copied from interface: MaybeObserver
      Called once the deferred computation completes normally.
      Specified by:
      onComplete in interface MaybeObserver<T>
    • subscribeActual

      protected void subscribeActual(MaybeObserver<? super T> observer)
      Description copied from class: Maybe
      Implement this method in subclasses to handle the incoming MaybeObservers.

      There is no need to call any of the plugin hooks on the current Maybe instance or the MaybeObserver; all hooks and basic safeguards have been applied by Maybe.subscribe(MaybeObserver) before this method gets called.

      Specified by:
      subscribeActual in class Maybe<T>
      Parameters:
      observer - the MaybeObserver to handle, not null
    • add

      boolean add(MaybeSubject.MaybeDisposable<T> inner)
    • remove

      void remove(MaybeSubject.MaybeDisposable<T> inner)
    • getValue

      @Nullable public T getValue()
      Returns the success value if this MaybeSubject was terminated with a success value.
      Returns:
      the success value or null
    • hasValue

      public boolean hasValue()
      Returns true if this MaybeSubject was terminated with a success value.
      Returns:
      true if this MaybeSubject was terminated with a success value
    • getThrowable

      @Nullable public @Nullable Throwable getThrowable()
      Returns the terminal error if this MaybeSubject has been terminated with an error, null otherwise.
      Returns:
      the terminal error or null if not terminated or not with an error
    • hasThrowable

      public boolean hasThrowable()
      Returns true if this MaybeSubject has been terminated with an error.
      Returns:
      true if this MaybeSubject has been terminated with an error
    • hasComplete

      public boolean hasComplete()
      Returns true if this MaybeSubject has been completed.
      Returns:
      true if this MaybeSubject has been completed
    • hasObservers

      public boolean hasObservers()
      Returns true if this MaybeSubject has observers.
      Returns:
      true if this MaybeSubject has observers
    • observerCount

      int observerCount()
      Returns the number of current observers.
      Returns:
      the number of current observers