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