I need to frequently access the result of a time-consuming calculation. The result changes infrequently, so I have to recalculate the data from time to time but it is ok to use the outdated result for a while. What would be the easiest way to do this and is there an existing library method or design pattern?
I am thinking of something like
private static List myCachedList = null;
...
// refresh list once in 3600 seconds
if (needsRefresh(myCachedList, 3600)) {
// run the calculation
myCachedList = ...
}
// use either updated or previous value from here on
A proper implementation might not be trivial, it might have to deal with thread safety, race conditions etc., so I would rather use a proven implementation than roll my own here.
I would suggest for you to use the Proxy Design Pattern that way you can encapsulate the caching logic-implementation in your proxy class
theres a cool example here that looks like to fit your needs
http://en.wikipedia.org/wiki/Proxy_pattern
Congratulations for realising that writing your own can be more trouble it initially appears!
I would check out the Guava cache solution. Guava is a proven library and the caches are easily available (and configurable) via a fluent factory API.
if you do not want to use third party library, simply you can create a static map which holds the key and value. using key you can retrieve the data fast.
and write methods to add values to cache, get, remove.
hope this helps
I would take a look at Google guava-libraries. Much of this work has already been done for you.
There's specifically a section called Timed Eviction, which might be related to what you want. https://github.com/google/guava/wiki/CachesExplained#timed-eviction