Проблема с этим шаблоном заключается в том, что вам нужно как-то определить значение, которое следует использовать в случае, если get()
возвращает ноль.
Конечно, есть библиотеки, и IIRC есть и более новые коллекции, которые делают это, но, к сожалению, я не помню, какие это были.
Однако вы можете написать служебный метод самостоятельно, при условии, что у вас есть стандартный способ создания новых значений. Примерно так может работать:
public static <K, V> V safeGet(K key, Map<K,V> map, Class<V> valueClass) throws /*add exceptions*/ {
V value = map.get(key);
if( value == null ) {
value = valueClass.newInstance();
map.put( key, value );
}
return value;
}
Обратите внимание, что вы должны либо выбросить исключения отражения, либо обработать их в методе. Кроме того, для этого требуется valueClass
для предоставления конструктора без аргументов. Кроме того, вы можете просто передать значение по умолчанию, которое следует использовать.