package de.invesdwin.util.collections.loadingcache; import java.util.Collection; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import javax.annotation.concurrent.ThreadSafe; @ThreadSafe public abstract class ADelegateLoadingCache<K, V> implements ILoadingCache<K, V> { private final ILoadingCache<K, V> delegate; public ADelegateLoadingCache() { //lazy initialization is too expensive here this.delegate = createDelegate(); } protected ILoadingCache<K, V> getDelegate() { return delegate; } protected abstract ILoadingCache<K, V> createDelegate(); @Override public V get(final K key) { return getDelegate().get(key); } @Override public void clear() { getDelegate().clear(); } @Override public boolean containsKey(final K key) { return getDelegate().containsKey(key); } @Override public void remove(final K key) { getDelegate().remove(key); } @Override public void put(final K key, final V value) { getDelegate().put(key, value); } @Override public Set<Entry<K, V>> entrySet() { return getDelegate().entrySet(); } @Override public int size() { return getDelegate().size(); } @Override public Set<K> keySet() { return getDelegate().keySet(); } @Override public Collection<V> values() { return getDelegate().values(); } @Override public Map<K, V> asMap() { return getDelegate().asMap(); } @Override public boolean isEmpty() { return getDelegate().isEmpty(); } }