PandaLib/pandalib-util/src/main/java/fr/pandacube/lib/util/LazyOrException.java

61 lines
1.5 KiB
Java
Raw Normal View History

package fr.pandacube.lib.util;
2021-08-08 12:56:36 +02:00
import java.util.Objects;
import fr.pandacube.lib.util.ThrowableUtil.SupplierException;
2021-08-08 12:56:36 +02:00
/**
* Represents a lazy loaded value.
*
* The value will be computed using the Supplier provided in the
* constructor, only the first time the {@link #get()} method is
* called.
*
* @param <T> the type of the enclosed value.
*/
public class LazyOrException<T> implements SupplierException<T> {
2021-08-08 12:56:36 +02:00
private T cachedValue;
private final SupplierException<T> supplier;
private boolean cached = false;
/**
* Create a lazy value loader that will call the provided supplier to get the value.
* @param s the supplier from which the value is fetched.
*/
2021-08-08 12:56:36 +02:00
public LazyOrException(SupplierException<T> s) {
supplier = Objects.requireNonNull(s);
}
/**
* Get the wrapped value, from cache or from the provider if it is not yet cached.
*
* If the provider throws an exception, it will be redirected to the caller as is, and no value will be cached
* (the next call to this method will execute the supplier again).
2021-08-08 12:56:36 +02:00
*/
@Override
2021-08-08 12:56:36 +02:00
public synchronized T get() throws Exception {
if (!cached)
2021-08-08 12:56:36 +02:00
set(supplier.get());
return cachedValue;
}
/**
* Reset the cached value. The next call to {@link #get()} will get the value from the provider.
*/
2021-08-08 12:56:36 +02:00
public synchronized void reset() {
cached = false;
cachedValue = null;
}
/**
* Manually set the value to the provided one.
* @param value the value to put in the cache.
*/
2021-08-08 12:56:36 +02:00
public synchronized void set(T value) {
cachedValue = value;
cached = true;
}
}