Search code examples
javacachinghashmapreusabilitystatic-factory

What is the best way to cache and reuse immutable singleton objects in Java?


I have a class representing a set of values that will be used as a key in maps.

This class is immutable and I want to make it a singleton for every distinct set of values, using the static factory pattern. The goal is to prevent identical objects from being created many (100+) times and to optimize the equals method.

I am looking for the best way to cache and reuse previous instances of this class. The first thing that pops to mind is a simple hashmap, but are there alternatives?


Solution

  • There are two situations:

    • If the number of distinct objects is small and fixed, you should use an enum
      • They're not instantiatiable beyond the declared constants, and EnumMap is optimized for it
    • Otherwise, you can cache immutable instances as you planned:
      • If the values are indexable by numbers in a contiguous range, then an array can be used
        • This is how e.g. Integer cache instances in a given range for valueOf
      • Otherwise you can use some sort of Map

    Depending on the usage pattern, you may choose to only cache, say, the last N instances, instead of all instances created so far. This is the approach used in e.g. re.compile in Python's regular expression module. If N is small enough (e.g. 5), then a simple array with a linear search may also work just fine.

    For Map based solution, perhaps a useful implementation is java.util.LinkedHashMap, which allows you to enforce LRU-like policies if you @Override the removeEldestEntry.

    There is also LRUMap from Apache Commons Collections that implement this policy more directly.

    See also

    Related questions