Полагаю, я другой человек, пытающийся создать какой-то кеш с помощью 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 () для проверки местоположения и индекса subongong) ). Я хочу использовать слабые ссылки, поэтому мне не нужно заботиться об удалении треков.
Я хотел спросить, нормально ли хранить слабую ссылку на ключ в WeakHashMap, и если нет, как мне подойти к этой проблеме? Мне нужны слабые ссылки и постоянное время получения кэшированных значений. Я думал о копировании кода WeakHashMap и обнародовании метода getEntry()
, который решает проблему, но это такой плохой взлом: (
PS. Я понимаю, что коллекции apache или google могут иметь что-то подобное, но я действительно не хочу добавлять 2-мегабайтные зависимости.