【发布时间】:2010-12-04 18:02:46
【问题描述】:
我想我是另一个试图用 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 :(
附言。我知道 apache 或 google 集合可能有这样的东西,但我真的不想添加 2Mb 依赖项。
【问题讨论】:
-
你需要WeakSet吗?阅读这篇stackoverflow.com/questions/4062919/…
-
@Stas Kurilin:我需要能够在不迭代的情况下获取对象,所以 Set 在这里不起作用。
标签: java caching weakhashmap