In my project there are several idiomatic uses of JDK collections. One is using Map
to uniquely index domain objects by some field. The code is simple:
public class IndexMap extends SafeHashMap { public static interface Mapper { public Object getKeyFor(final Object value); } private final Mapper mapper; public IndexMap(final Class keyClass, final Class valueClass, final Mapper mapper) { super(keyClass, valueClass); this.mapper = mapper; } public IndexMap(final Class keyClass, final Class valueClass, final Mapper mapper, final Collection values) { this(keyClass, valueClass, mapper); addAll(values); } public void add(final Object value) { put(mapper.getKeyFor(value), value); } public void addAll(final Collection values) { for (final Iterator it = values.iterator(); it.hasNext();) add(it.next()); } }
(SafeHashMap
is another JDK collection extension. It forbids null
keys and values, and requires they be of certain classes.)
Idiomatic use looks like:
new IndexMap(KeyType.class, DomainType.class, new IndexMap.Mapper() { public Object getKeyFor(final Object value) { return ((DomainType) value).getKey(); } }, initialValues);
Which indexes a collection of DomainType
domain objects by the key property.
UPDATE: Because of editing several files at once, I suffered a brain fart and mixed IndexMap
(the point of this post) with AutoHashMap
(another, still interesting collection).
No comments:
Post a Comment