001 /*
002 @license.text@
003 */
004 package biz.hammurapi.cache;
005
006 import java.lang.ref.Reference;
007 import java.lang.ref.SoftReference;
008 import java.util.HashMap;
009 import java.util.Map;
010
011 /**
012 * Map with soft-referenced values.
013 * @author Pavel Vlasov
014 * @revision $Revision$
015 */
016 public class SoftHashMap extends HashMap {
017 private Object nullMarker=new Object();
018
019 /**
020 *
021 */
022 private static final long serialVersionUID = 4095082501213777588L;
023
024 public SoftHashMap() {
025 super();
026 }
027
028 public SoftHashMap(int initialCapacity) {
029 super(initialCapacity);
030 }
031
032 public SoftHashMap(int initialCapacity, float loadFactor) {
033 super(initialCapacity, loadFactor);
034 }
035
036 public SoftHashMap(Map m) {
037 super(m);
038 }
039
040 public Object put(Object key, Object value) {
041 return super.put(key, new SoftReference(value==null ? nullMarker : value));
042 }
043
044 public Object get(Object key) {
045 Reference ref = (Reference) super.get(key);
046 if (ref==null) {
047 return null;
048 }
049
050 Object value = ref.get();
051 if (value==null) {
052 remove(key);
053 }
054 return value==nullMarker ? null : value;
055 }
056
057 }