package htsjdk.samtools.util;
/**
* Simple utility for building an on-demand (lazy) object-initializer.
*
* Works by accepting an initializer describing how to build the on-demand object, which is only called once and only after the first
* invocation of {@link #get()} (or it may not be called at all).
*
* @author mccowan
*/
public class Lazy<T> {
private final LazyInitializer<T> initializer;
private boolean isInitialized = false;
private T instance;
/** Simple cons */
public Lazy(final LazyInitializer<T> initializer) {
this.initializer = initializer;
}
/** Returns the instance associated with this {@link Lazy}, initializing it if necessary. */
public synchronized T get() {
if (!isInitialized) {
this.instance = initializer.make();
isInitialized = true;
}
return instance;
}
/** Describes how to build the instance of the lazy object. */
public interface LazyInitializer<T> {
/** Returns the desired object instance. */
T make();
}
public boolean isInitialized() {
return isInitialized;
}
}