Search code examples
javahashmapjava-9factory-method

How to preserve order of insertion in Map.of factory?


Java 9 offers Map.of() feature to easily create a map with fixed values.

Problem: I want to create a map that preserves order of insertion like LinkedHashMap. Is that possible with that factory? At least map.of() does not preserv the order...


Solution

  • There isn't a factory method like LinkedHashMap::of indeed, and a Map does not have an order per-se, so the only way I see it is to build a LinkedHashMap if you really needed one.

    Btw from the JEP itself:

    Static factory methods on concrete collection classes (e.g., ArrayList, HashSet) have been removed from this proposal ...

    There is another wrinkle, which is that static methods on classes are inherited by subclasses. Suppose a static factory method HashMap.of() were to be added. Since LinkedHashMap is a subclass of HashMap, it would be possible for application code to call LinkedHashMap.of(). This would end up calling HashMap.of(), not at all what one would expect!

    Point here is that static methods are inherited, but not overridable, thus if such a method would have been added to HashMap it could have not been overridden in LinkedHashMap.

    If you can use guava, you could use ImmutableMap that is documented as:

    An immutable, hash-based Map with reliable user-specified iteration order...