class WeakKeySoftValueLoadingCache {

    @Nullable
    public V get(K key) {
        final CacheValue<K, V> cacheValue = cache.get(key);
        if (cacheValue != null) {
            return cacheValue.get(key);
        } else {
            CacheValue<K, V> value = new CacheValue<>(key, valueSupplier);
            cache.put(key, value);
            return value.get(key);
        }
    }

    public  WeakKeySoftValueLoadingCache(ValueSupplier<K, V> valueSupplier);

}