package eu.ggnet.saft.core.all;
import java.util.concurrent.Callable;
import lombok.EqualsAndHashCode;
import lombok.ToString;
/**
*
* @author oliver.guenther
* @param <T>
*/
@EqualsAndHashCode
@ToString
public class OnceCaller<T> {
private final Callable<T> callable;
private T onceResult = null;
private boolean evaluated;
public OnceCaller(Callable<T> before) {
this.callable = before;
}
/**
* Returns true if and only if the supplied callable in constructor was not null, but the result of call is null. Implies the evaluation of callable.call().
*
* @return true if and only if the supplied callable in constructor was not null, but the result of call is null.
* @throws Exception
*/
public boolean ifPresentIsNull() throws Exception {
evalOnce();
if (callable == null) return false;
return onceResult == null;
}
public T get() throws Exception {
evalOnce();
return onceResult;
}
private void evalOnce() throws Exception {
if (evaluated) return;
evaluated = true;
if (callable != null) onceResult = callable.call();
}
public Callable<T> getCallable() {
return callable;
}
}