Основная проблема здесь в том, что вы пытаетесь достичь, в корне неверно. Проверьте методы вашего класса. Большинство из них теперь будут несовместимы с get
. Хуже того, как именно методы реализуются в терминах других открытых методов, не определено - таково проклятие наследования.
Поэтому создайте класс, представляющий любую абстракцию, которую вы пытаетесь достичь. содержит , не наследуя от соответствующей реализации карты.
Естественная карта в этом случае, вероятно, не старая Hashtable
, а java.util.concurrent.ConcurrentHashMap
. Важным методом здесь является [putIfAbsent
] [2]. К сожалению API документы отстой. Вот как это следует использовать:
public V getOrCreate(K key) {
final V value = map.get(key);
if (value != null) {
return value;
}
V newValue = factory.create(key); // May discard.
V oldValue = map.putIfAbsent(key, value);
return oldValue==null ? newValue : oldValue;
}
(Вы можете использовать Future
, если хотите быть уверенным, что никогда не сбросите значение.)
Для создания я предположил какую-то абстрактную фабрику. В общем случае методы не имеют открытых конструкторов без аргументов, которые бы не генерировали исключения. Конечно, избегайте отражения, как свиной грипп, скрещенный с H5N1. Вместо этого используйте соответствующую (специфичную для абстракции) абстрактную фабрику, переданную во время создания.
public interface MySortOfFactory<
T /*extends SomeEntity*/,
A /*extends SomeInfo*/
> {
T create(A arg);
}
[2]: http://java.sun.com/javase/6/docs/api/java/util/concurrent/ConcurrentMap.html#putIfAbsent(K, V)