package io.shockah.skylark.util;
import io.shockah.skylark.UnexpectedException;
import io.shockah.skylark.func.Func0;
import org.apache.commons.lang3.concurrent.ConcurrentException;
import org.apache.commons.lang3.concurrent.LazyInitializer;
public class Lazy<T> extends LazyInitializer<T> {
public static <R> Lazy<R> of(Func0<R> func) {
return new Lazy<R>(func);
}
protected final Func0<T> func;
public Lazy(Func0<T> func) {
this.func = func;
}
protected T initialize() throws ConcurrentException {
return func.call();
}
public synchronized T get() {
T obj = null;
try {
obj = super.get();
} catch (Exception e) {
throw new UnexpectedException(e);
}
return obj;
}
}