T - the type of the contained element.@ThreadSafe public abstract class LazyReference<T> extends WeakReference<T> implements Supplier<T>
final keyword has been used (you cannot reset it once it has
been constructed). Object creation is guaranteed to be thread-safe and the
first thread that calls get() will be the one that creates it.
Usage: clients need to implement the create() method to return the
object this reference will hold.
For instance:
final LazyReference<MyObject> ref = new LazyReference() {
protected MyObject create() throws Exception {
// Do expensive object construction here
return new MyObject();
}
};
Then call get() to get a reference to the referenced object:
MyObject myLazyLoadedObject = ref.get()NOTE: Interruption policy is that if you want to be cancellable while waiting for another thread to create the value, instead of calling
get()
call getInterruptibly(). However, If your create() method
is interrupted and throws an InterruptedException, it is
treated as an application exception and will be the causal exception inside
the runtime
LazyReference.InitializationException
that get() or getInterruptibly() throws and your
create() will not be called again.
This class is NOT Serializable.
Implementation note. This class extends WeakReference
as Reference does not have a public constructor.
WeakReference is preferable as it does not have any members and therefore
doesn't increase the memory footprint. As we never pass a referent through to
the super-class and override get(), the garbage collection semantics
of WeakReference are irrelevant. The referenced object will not become
eligible for GC unless the object holding the reference to this object is
collectible.
| Modifier and Type | Class and Description |
|---|---|
static class |
LazyReference.InitializationException
If the factory
create() method threw an exception,
this wraps it. |
| Constructor and Description |
|---|
LazyReference()
Constructor for LazyReference.
|
| Modifier and Type | Method and Description |
|---|---|
void |
cancel()
Cancel the initializing operation if it has not already run.
|
protected abstract T |
create()
The object factory method, guaranteed to be called once and only once.
|
T |
get()
Get the lazily loaded reference in a non-cancellable manner.
|
T |
getInterruptibly()
Get the lazily loaded reference in a cancellable manner.
|
boolean |
isInitialized()
Has the
create() reference been initialized. |
clear, enqueue, isEnqueuedprotected abstract T create() throws Exception
get() and getInterruptibly() will
return.Exception - if anything goes wrong, rethrown as an
InitializationException from get() and getInterruptibly()public final T get()
create() method throws an Exception calls to
get() will throw an InitializationException which wraps the
previously thrown exception.public final T getInterruptibly() throws InterruptedException
create() method throws an Exception, calls to
get() will throw a RuntimeException which wraps the previously
thrown exception.create() created.LazyReference.InitializationException - if the create() method throws an exception. The
Throwable.getCause()
will contain the exception thrown by the create() methodInterruptedException - If the calling thread is Interrupted
while waiting for another thread to create the value (if the creating
thread is interrupted while blocking on something, the
InterruptedException will be thrown as the causal
exception of the
LazyReference.InitializationException
to everybody calling this method).public final boolean isInitialized()
create() reference been initialized.public final void cancel()
Copyright © 2016 Atlassian. All rights reserved.