首页 > 解决方案 > 部分继承Java中的接口?

问题描述

我想实现一个简单的缓存接口:

public interface Cache {
    Object get(Object key);
    Object put(Object key, Object value);
    void clear();
}

我意识到它是接口 java.util.Map 的一部分。所以像 HashMap 这样的对象应该能够被传递给需要 Cache 对象的函数。

但另一方面,我不想让我自己的 Cache 类实现整个 Map 接口,因为我真的不需要这三个以外的其他方法。

Java 不是鸭式语言,那么在这种情况下最佳实践是什么?

标签: javaoop

解决方案


Cache我认为你可以在类的实现中包装 Map

class CacheImpl<K, V> implements Cache<K, V> {
    Map<K, V> cacheMap;

    CacheImpl() {
        this(new LinkedHashMap<>());
    }

    CacheImpl(Map<K,V> cacheMap) {
        this.cacheMap = cacheMap;
    }

    @Override
    public V get(K key) {
        return cacheMap.get(key);
    }

    @Override
    public V put(K key, V value) {
        return cacheMap.put(key, value);
    }

    @Override
    public void clear() {
        cacheMap.clear();
    }
}

我已经添加了带有 Generic 的示例,但您始终可以自由地使用 Object 作为键和值。

因此,在我的示例中,要使其成为线程安全的,我们可以我们ConcurrentHashMap已经thread safe很好地实现了。我会建议有一个工厂类来创建缓存对象,如下所示。

class CacheImplFactory {
    public static <K, V> Cache<K, V> newSimpleCache() {
        return new CacheImpl<K, V>();
    }

    public static <K, V> Cache<K, V> newSynchronizedCache() {
        return new CacheImpl<K, V>(new ConcurrentHashMap<>());
    }

    public static <K, V> Cache<K, V> newWeakCache() {
        return new CacheImpl<K, V>(new WeakHashMap<>());
    }
}

推荐阅读