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