/** * Copyright (c) 2016-present, RxJava Contributors. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License is * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See * the License for the specific language governing permissions and limitations under the License. */ package io.reactivex; import io.reactivex.annotations.*; import io.reactivex.internal.functions.ObjectHelper; import io.reactivex.internal.util.NotificationLite; /** * Represents the reactive signal types: onNext, onError and onComplete and * holds their parameter values (a value, a Throwable, nothing). * @param <T> the value type */ public final class Notification<T> { final Object value; /** Not meant to be implemented externally. */ private Notification(Object value) { this.value = value; } /** * Returns true if this notification is an onComplete signal. * @return true if this notification is an onComplete signal */ public boolean isOnComplete() { return value == null; } /** * Returns true if this notification is an onError signal and * {@link #getError()} returns the contained Throwable. * @return true if this notification is an onError signal * @see #getError() */ public boolean isOnError() { return NotificationLite.isError(value); } /** * Returns true if this notification is an onNext signal and * {@link #getValue()} returns the contained value. * @return true if this notification is an onNext signal * @see #getValue() */ public boolean isOnNext() { Object o = value; return o != null && !NotificationLite.isError(o); } /** * Returns the contained value if this notification is an onNext * signal, null otherwise. * @return the value contained or null * @see #isOnNext() */ @SuppressWarnings("unchecked") @Nullable public T getValue() { Object o = value; if (o != null && !NotificationLite.isError(o)) { return (T)value; } return null; } /** * Returns the container Throwable error if this notification is an onError * signal, null otherwise. * @return the Throwable error contained or null * @see #isOnError() */ @Nullable public Throwable getError() { Object o = value; if (NotificationLite.isError(o)) { return NotificationLite.getError(o); } return null; } @Override public boolean equals(Object obj) { if (obj instanceof Notification) { Notification<?> n = (Notification<?>) obj; return ObjectHelper.equals(value, n.value); } return false; } @Override public int hashCode() { Object o = value; return o != null ? o.hashCode() : 0; } @Override public String toString() { Object o = value; if (o == null) { return "OnCompleteNotification"; } if (NotificationLite.isError(o)) { return "OnErrorNotification[" + NotificationLite.getError(o) + "]"; } return "OnNextNotification[" + value + "]"; } /** * Constructs an onNext notification containing the given value. * @param <T> the value type * @param value the value to carry around in the notification, not null * @return the new Notification instance * @throws NullPointerException if value is null */ @NonNull public static <T> Notification<T> createOnNext(@NonNull T value) { ObjectHelper.requireNonNull(value, "value is null"); return new Notification<T>(value); } /** * Constructs an onError notification containing the error. * @param <T> the value type * @param error the error Throwable to carry around in the notification, not null * @return the new Notification instance * @throws NullPointerException if error is null */ @NonNull public static <T> Notification<T> createOnError(@NonNull Throwable error) { ObjectHelper.requireNonNull(error, "error is null"); return new Notification<T>(NotificationLite.error(error)); } /** * Returns the empty and stateless shared instance of a notification representing * an onComplete signal. * @param <T> the target value type * @return the shared Notification instance representing an onComplete signal */ @SuppressWarnings("unchecked") @NonNull public static <T> Notification<T> createOnComplete() { return (Notification<T>)COMPLETE; } /** The singleton instance for createOnComplete. */ static final Notification<Object> COMPLETE = new Notification<Object>(null); }