我想我是另一个试图用 WeakHashMap 做某种缓存的人。我需要一些帮助。
我有一堆TrackData
包含有关音轨信息的对象。然后有一些Track
对象保持对TrackData
内部的引用。几个轨道可以指向同一个TrackData
。然后我的TrackDataCache
课程看起来像这样:
public class TrackDataCache {
private static TrackDataCache instance = new TrackDataCache();
public static TrackDataCache getInstance() {
return instance;
}
private WeakHashMap<TrackData, WeakReference<TrackData>> cache = new WeakHashMap<TrackData, WeakReference<TrackData>>();
public void cache(Track track) {
TrackData key = track.getTrackData();
WeakReference<TrackData> trackData = cache.get(key);
if (trackData == null) {
cache.put(key, new WeakReference<TrackData>(key));
} else {
track.setTrackData(trackData.get());
}
}
}
因此,当我加载曲目时,我会调用TrackDataCache.cache()
,如果之前未加载其曲目数据,则将其缓存或替换为缓存副本(TrackData
覆盖 equals() 方法以检查位置和子歌曲索引)。我想使用弱引用,这样我在删除 Tracks 时就不需要关心了。
我想问在 WeakHashMap 中保持对键的弱引用是否可行,如果不是,我应该如何解决这个问题?我需要弱引用和恒定时间检索缓存值。我正在考虑复制 WeakHashMap 代码并将getEntry()
方法公开,这解决了问题,但这是一个糟糕的 hack :(
PS。我知道 apache 或 google 集合可能有这样的东西,但我真的不想添加 2Mb 依赖项。