blob: f429eab4b2fe810967af2e59788795186bff5e71 [file] [log] [blame]
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.base.supplier;
import org.chromium.base.Callback;
/**
* ObservableSupplier wraps an asynchronously provided object E, notifying observers when the
* dependency is available. This allows classes dependent on E to be provided with a
* ObservableSupplier during construction and register a Callback<E> to be notified when the needed
* dependency is available.
*
* This class must only be accessed from a single thread.
*
* For classes owning the ObservableSupplier and providing it as a dependency to others, see
* {@link ObservableSupplierImpl}.
*
* For classes using a ObservableSupplier to receive a dependency:
* - To be notified when the object is available, call {@link #addObserver(Callback)} with a
* Callback to be notified when the object is available.
* - If the object is already available, the Callback will be called immediately.
* - The Callback may be called multiple times if the object wrapped by the ObservableSupplier
* changes.
*
* @param <E> The type of the wrapped object.
*/
public interface ObservableSupplier<E> extends Supplier<E> {
/**
* @param obs An observer to be notified when the object owned by this supplier is available.
* If the object is already available, the callback will be notified at the end of the
* current message loop (so long as the object hasn't changed).
* @return The current object or null if it hasn't been set yet.
*/
E addObserver(Callback<E> obs);
/**
* @param obs The observer to remove.
*/
void removeObserver(Callback<E> obs);
}