Java 通用缓存类简单实现

2,038 阅读1分钟

文章来源

使用方法

很简单,两行代码搞定。

DataCache<Object> dataCache =
   new DataCache<>(() -> mDao.getAll());
List<Object> =  dataCache.getData()

其中() -> mDao.getAll()是超时的时候自动调用的接口。

假设你之前获取数据的方法是 getData() , 那上述代码就应该改成 () -> getData()

最后使用 dataCache.getData() 获取数据即可。

代码简单实现

  /**
     * 使用方法示例
     * 初始化
     * DataCache<Object> dataCache = new DataCache<>(() -> mDao.getAll());
     * 读取缓存
     * List<Object> =  dataCache.getData()
     * 如果你有多个缓存,你可以考虑使用 Map 结构来存储
     * Map<String, DataCache<Object>> cacheMap = new HashMap<>();
     *
     * @param <T> 数据类型
     * @author Zmaplex
     * @version 0.1
     */
    public class DataCache<T> {
        /**
         * 超时时间,单位秒
         * 可以使用如下构造器,设置超时时间
         * DataCache(DataCacheCall<T> dataCacheCall, int outTime)
         */
        private int outTime = 100;
        /**
         * 最后修改时间。
         * 每次读取数据的时候,自动更新这个字段。
         */
        private long lastModify = 0;
        /**
         * 通用数据列表,用作缓存
         */
        private List<T> data = new ArrayList<>();
        /**
         * 数据缓存回调接口
         * 当超时的时候,将自动调用 onCallUpdate 更新 data 数据。
         */
        private DataCacheCall<T> dataCacheCall;

        /**
         * 构造器
         *
         * @param dataCacheCall 数据缓存回调
         */
        public DataCache(DataCacheCall<T> dataCacheCall) {
            this.dataCacheCall = dataCacheCall;
        }

        /**
         * 构造器
         *
         * @param dataCacheCall 数据缓存回调
         * @param outTime       超时时间,单位秒
         */
        public DataCache(DataCacheCall<T> dataCacheCall, int outTime) {
            this.dataCacheCall = dataCacheCall;
            this.outTime = outTime;
        }

        /**
         * 返回缓存数据
         * 超时的时候会自动调用回调接口更新数据
         *
         * @return 返回列表数据
         */

        public List<T> getData() {
            long during = (System.currentTimeMillis() - lastModify) / 1000;
            if (during > outTime) {
                data = dataCacheCall.onCallUpdate();
            }
            lastModify = System.currentTimeMillis();
            return data;
        }

        /**
         * @param <T> 泛型
         */
        private interface DataCacheCall<T> {
            List<T> onCallUpdate();
        }
    }