org.unlaxer.util.cache.SupplierBoundCache Maven / Gradle / Ivy
package org.unlaxer.util.cache;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Supplier;
public class SupplierBoundCache extends BoundCache implements Supplier{
V value;
Supplier supplier;
long lastTime = 0L;
final Long evictionTimeInMilli;
Optional> consumerWhenClearing;
boolean clear;
public SupplierBoundCache(Supplier supplier) {
this(NameAndTags.of(supplier) , supplier);
}
public SupplierBoundCache(NameAndTags nameAndTags , Supplier supplier) {
this(nameAndTags , supplier , null);
}
public SupplierBoundCache(Supplier supplier , Consumer consumerWhenClearing) {
this(NameAndTags.of(supplier) , supplier , consumerWhenClearing);
}
public SupplierBoundCache(NameAndTags nameAndTags , Supplier supplier , Consumer consumerWhenClearing) {
super(nameAndTags);
this.supplier = supplier;
evictionTimeInMilli = null;
this.consumerWhenClearing = Optional.ofNullable(consumerWhenClearing);
}
public SupplierBoundCache(Supplier supplier, int evictionTimeInMilli) {
this(NameAndTags.of(supplier) , supplier , evictionTimeInMilli);
}
public SupplierBoundCache(NameAndTags nameAndTags , Supplier supplier, int evictionTimeInMilli) {
this(nameAndTags ,supplier , evictionTimeInMilli , null);
}
public SupplierBoundCache(Supplier supplier, int evictionTimeInMilli , Consumer consumerWhenClearing) {
this(NameAndTags.of(supplier) , supplier , evictionTimeInMilli , consumerWhenClearing);
}
public SupplierBoundCache(NameAndTags nameAndTags ,Supplier supplier, int evictionTimeInMilli , Consumer consumerWhenClearing) {
super(nameAndTags);
this.supplier = supplier;
this.evictionTimeInMilli = (long) evictionTimeInMilli;
this.consumerWhenClearing = Optional.ofNullable(consumerWhenClearing);
}
public static SupplierBoundCache of(Supplier supplier){
return new SupplierBoundCache<>(NameAndTags.of(supplier) , supplier);
}
public static SupplierBoundCache of(NameAndTags nameAndTags ,Supplier supplier){
return new SupplierBoundCache<>(nameAndTags , supplier);
}
public synchronized V get(){
if(evictionTimeInMilli == null){
if(value != null){
return value;
}
value = supplier.get();
return value;
}
long now = System.currentTimeMillis();
if(lastTime + evictionTimeInMilli < now || value == null){
lastTime = now;
value = supplier.get();
}
return value;
}
public synchronized void clear(){
consumerWhenClearing.ifPresent(consumer->consumer.accept(value));
value = null;
}
} © 2015 - 2025 Weber Informatics LLC | Privacy Policy