Re: Table object
Lew wrote:
Daniel Pitts wrote:
I often use the following instead of a lazy list:
public static <K,V> List<V> getReadableList(Map<K,V> map, K key) {
final List<V> list = map.get(key);
if (list == null) { return Collections.emptyList(); }
return list;
}
The danger with this 'getReadableList()' implementation is that client
code might modify the contents of the returned List, and thus disturb
assumptions of 'map' or other code that accesses it. For the same
reason, it is not thread safe. It doesn't do anything different from
a simple 'map.get(key)' other than return an immutable empty List
instead of 'null'.
This could be improved then:
public static <K,V> List<? extends V> getReadableList(
Map<K,? extends List<? extends V>> map, K key) {
final List<? extends V> list = map.get(key);
if (list == null) { return Collections.emptyList(); }
return Collections.unmodifiableList(list);
}
public static <K,V> List<V> getWritableList(Map<K,V> map, K key) {
List<V> list = map.get(key);
if (list == null) {
list = new ArrayList<V>();
mput.put(key, list);
}
return list;
}
This has a similar risk. Sometimes you get back a List that can alter
'map', sometimes you don't. The only difference from the first method
is that a 'null' result from 'map.get(key)' results in a mutable empty
List that can change 'mput' (a member?) instead of an immutable one
that cannot. If 'map.get(key)' returns a List instance, the two
behave the same.
Similar improvement:
public static <K,V> ArrayList<V> getWritableList(
Map<K,ArrayList<V>> map, K key) {
final ArrayList<V> list = map.get(key);
if (list == null) {
list = new ArrayList<V>();
mput.put(key, list);
}
return list;
}
--
Daniel Pitts' Tech Blog: <http://virtualinfinity.net/wordpress/>