java - 部分继承Java中的接口?
问题描述
我想实现一个简单的缓存接口:
public interface Cache {
Object get(Object key);
Object put(Object key, Object value);
void clear();
}
我意识到它是接口 java.util.Map 的一部分。所以像 HashMap 这样的对象应该能够被传递给需要 Cache 对象的函数。
但另一方面,我不想让我自己的 Cache 类实现整个 Map 接口,因为我真的不需要这三个以外的其他方法。
Java 不是鸭式语言,那么在这种情况下最佳实践是什么?
解决方案
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<>());
}
}
推荐阅读
- python - 返回属性名称 Networkx Python
- php - 无法在 PHP 中循环遍历数组
- github - ssh正常时如何修复github权限被拒绝
- python - Flask IMAP 应用程序检索不必要和不正确的字符
- java - 如何遍历 Firebase 孩子的孩子并将他们的键添加到列表中?
- perl - 将对象引用存储在哈希键值中(在差异类中)并调用方法
- excel - VBA中的特殊IF/THEN语句和数据验证列表
- javascript - 如何将我的 React Table 的选定行数保存/存储到变量中?- 反应JS
- amazon-web-services - 限制 API 访问单个源 IP
- ruby - 当我在 IRB 中声明时,为什么我的顶级方法在所有类上都是公共的(而不是私有的)?