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 }