Java では、ConcurrentMap のエントリを遅延して取得し、必要な場合にのみ作成する必要があることがよくあります。
たとえば、私は持っているかもしれません
ConcurrentMap<String, AtomicReference<Something>> a = new ConcurrentHashMap<>();
ConcurrentMap<String, Something> b = new ConcurrentHashMap<>();
この仕事を行う汎用関数を作成して、型ごとにやや面倒な二重チェック コードを繰り返さないようにしたかったのです。
以下は私が得ることができる限りでした:
<K, V, C extends V> V ensureEntry(ConcurrentMap<K, V> map, K key, Class<? super C> clazz) throws Exception {
V result = map.get(key);
if (result == null) {
final V value = (V)clazz.newInstance();
result = map.putIfAbsent(key, value);
if (result == null) {
result = value;
}
}
return result;
}
そして、次のように使用できます。
AtomicReference<Something> ref = ensureElement(a, "key", AtomicReference.class);
Something something = ensureElement(b, "another key", Something.class);
問題は、関数が非常に汚れていて、まだ安全でないジェネリック クラス キャスト ( (V)
) があることです。完全に一般的でクリーンなものは可能でしょうか? おそらくScalaで?
ありがとう!