3

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で?

ありがとう!

4

1 に答える 1