SimpleCalculationMemorizer.java
package eu.javaexperience.generic;
import java.util.Collections;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import eu.javaexperience.asserts.AssertArgument;
import eu.javaexperience.interfaces.simple.getBy.GetBy1;
import eu.javaexperience.semantic.references.ContainsNotNull;
public class SimpleCalculationMemorizer<R,A>
{
protected final GetBy1<R, A> calculator;
public SimpleCalculationMemorizer(@ContainsNotNull GetBy1<R, A> calculator)
{
AssertArgument.assertNotNull(calculator, "calculator");
this.calculator = calculator;
}
protected final ConcurrentHashMap<A, R> results = new ConcurrentHashMap<>();
protected final Map<A, R> ro = Collections.unmodifiableMap(results);
public R calcuate(A arg)
{
AssertArgument.assertNotNull(arg, "calcualtion argument");
R ret = results.get(arg);
if(null == ret)
{
results.putIfAbsent(arg, ret = calculator.getBy(arg));
}
return ret;
}
public void reset()
{
results.clear();
}
/**
* Returns the calculated values as a bound unmodifyable map.
* */
public Map<A, R> getCalculatedValues()
{
return ro;
}
}