public boolean equals(Object other) { boolean ret = false; S one = null; ret = other == this || (other instanceof SoftReference<?> && (one = get()) != null && one.equals(((SoftReference<?>)other).get())); return ret; }
@Override public synchronized V get(Object key) { V ret = super.get(key); if (ret == null) { IdAwareReference<K, V> ref = accessBasedAging ? reapableMap.remove(key) : reapableMap.get(key); if (ref != null) { if (ref.isEnqueued()) { ref.clear(); reapableMap.remove(key); } else { ret = ref.get(); if (ret == null) { reapableMap.remove(key); } else if (accessBasedAging) { // re-insert on timestamp reset so // as to maintain insertion order reapableMap.put(ref.key, ref.reset()); } } } } reap(); return ret; }
public int hashCode() { S one = get(); return one != null ? one.hashCode() : 0; }
/** * Mark a key as being reapable, caching corresponding soft reference to * corresponding value in the secondary map. * * @param k */ public synchronized void reapable(K k) { V v = super.remove(k); if (v != null) { reapableMap.put(k, new IdAwareReference<K, V>(k, v, queue)); } reap(); }
@Override public synchronized V remove(Object key) { V ret = super.remove(key); if (ret == null) { IdAwareReference<K, V> ref = reapableMap.remove(key); if (ref != null) { if (ref.isEnqueued()) { ref.clear(); } else { ret = ref.get(); } } } reap(); return ret; }