package com.ulisesbocchio.jasyptspringboot.util;
import java.util.function.Supplier;
/**
* Singleton initializer class that uses an internal supplier to supply the singleton instance. The supplier
* originally checks whether the instanceSupplier
* has been initialized or not, but after initialization the instance supplier is changed to avoid extra logic
* execution.
*/
public final class Singleton<R> implements Supplier<R> {
private boolean initialized = false;
private volatile Supplier<R> instanceSupplier;
public Singleton(final Supplier<R> original) {
instanceSupplier = () -> {
synchronized (original) {
if (!initialized) {
final R singletonInstance = original.get();
instanceSupplier = () -> singletonInstance;
initialized = true;
}
return instanceSupplier.get();
}
};
}
@Override
public R get() {
return instanceSupplier.get();
}
}