Рассмотрим это расширение HashMap ( генерирует экземпляр класса V при вызове "get", если он равен нулю)
public class HashMapSafe<K, V> extends HashMap<K, V> implements Map<K, V>{
private Class<V> dataType;
public HashMapSafe(Class<V> clazz){
dataType = clazz;
}
@SuppressWarnings("unchecked")
@Override
public V get(Object key) {
if(!containsKey(key)){
try {
put((K)key, dataType.newInstance());
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return super.get(key);
}
}
Его используют примерно так
Map<String,Section> sections = new HashMapSafe<String,Section>(Section.class);
sections.get(sectionName); //always returns a Section instance, existing or new
Мне кажется излишним указывать "Section" дважды, один раз как общий тип, а также поставьте его класс. Я предполагаю, что это невозможно, но можно ли реализовать HashMapSafe (с сохранением той же функциональности), чтобы его можно было использовать вот так?
Map<String,Section> sections = new HashMapSafe<String,Section>();
Или вот так ?:
Map<String,Section> sections = new HashMapSafe<String>(Section.class);