You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java泛型:如何避免接口被不同参数重复实现的问题

Hey,我来给你拆解下这个缓存抽象设计的思路和具体实现示例吧~

缓存接口设计与实现方案

核心统一缓存接口

我们首先定义了一个极简的缓存接口,风格和Map类似,目的是统一不同缓存框架的操作入口,让业务代码和底层缓存实现解耦:

public interface ICache<K, V> {
    // 基础缓存操作方法,和Map风格对齐
    V get(K key);
    void put(K key, V value);
    void remove(K key);
    boolean containsKey(K key);
}

不管后续用EHCache、Redis还是Memcached,只要实现这个接口,上层业务就能无差别调用缓存能力。

抽象缓存包装类(以EHCache为例)

为了复用缓存框架的通用逻辑,我们可以写一个抽象包装类,实现ICache接口并封装EHCache的基础操作:

public abstract class EHCacheWrapper<K,V> implements ICache<K, V> {
    // 持有EHCache的核心实例
    protected Cache ehCache;

    // 通过构造器注入EHCache实例
    public EHCacheWrapper(Cache ehCache) {
        this.ehCache = ehCache;
    }

    // 实现通用的get方法
    @Override
    public V get(K key) {
        Element element = ehCache.get(key);
        return element != null ? (V) element.getObjectValue() : null;
    }

    // 其他通用操作(比如put、remove)也可以在这里统一实现,差异化逻辑留给子类
}

这个抽象类的作用是把EHCache的通用操作封装好,避免每个具体实现类重复写相同代码。

具体业务缓存实现类

基于上面的抽象包装类,我们可以快速实现针对特定业务场景的缓存类,比如认证场景的AuthenticCache:

public class AuthenticCache extends EHCacheWrapper<String, UserInfo> {

    public AuthenticCache(Cache ehCache) {
        super(ehCache);
    }

    // 定制化的认证缓存方法,比如带过期时间的用户信息存储
    public void putUserInfo(String token, UserInfo userInfo, int expireSeconds) {
        Element element = new Element(token, userInfo);
        element.setTimeToLive(expireSeconds);
        ehCache.put(element);
    }

    // 如果需要覆盖通用方法的逻辑,也可以在这里重写
}

这套设计的核心优势

  • 解耦性强:业务代码只依赖ICache接口,后续切换缓存框架(比如从EHCache换成Redis),只需要新增对应框架的包装类和实现类,完全不用修改业务代码。
  • 代码复用:抽象包装类封装了缓存框架的通用逻辑,减少重复代码。
  • 扩展性好:新增任何缓存实现,只需要实现ICache接口或者基于对应抽象包装类扩展即可。

内容的提问来源于stack exchange,提问作者Richard Sand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:10:54