1 52 53 package com.go.trove.util; 54 55 import java.util.*; 56 57 69 public class Cache extends SoftHashMap { 70 private final int mMaxRecent; 71 private final UsageMap mUsageMap; 73 74 83 public Cache(int maxRecent) { 84 if (maxRecent <= 0) { 85 throw new IllegalArgumentException 86 ("Max recent must be greater than zero: " + maxRecent); 87 } 88 mMaxRecent = maxRecent; 89 mUsageMap = new UsageMap(); 90 } 91 92 99 public Cache(Cache cache) { 100 mMaxRecent = cache.mMaxRecent; 101 mUsageMap = cache.mUsageMap; 102 } 103 104 public Object get(Object key) { 105 Object value = super.get(key); 106 if (value != null || super.containsKey(key)) { 107 adjustMRU(key, value); 108 } 109 return value; 110 } 111 112 public Object put(Object key, Object value) { 113 if (value == null) { 114 value = new Null(); 115 } 116 adjustMRU(key, value); 117 return super.put(key, value); 118 } 119 120 public Object remove(Object key) { 121 synchronized (mUsageMap) { 122 mUsageMap.remove(key); 123 } 124 return super.remove(key); 125 } 126 127 public void clear() { 128 super.clear(); 129 synchronized (mUsageMap) { 130 mUsageMap.clear(); 131 } 132 } 133 134 private void adjustMRU(Object key, Object value) { 135 synchronized (mUsageMap) { 136 Object existing = mUsageMap.get(key); 137 138 if (existing != null) { 139 if (value == null && existing instanceof Null) { 140 value = existing; 141 } 142 } 143 else { 144 if (!mUsageMap.containsKey(key)) { 145 while (mUsageMap.size() >= mMaxRecent) { 148 mUsageMap.remove(mUsageMap.lastKey()); 149 } 150 } 151 } 152 153 mUsageMap.put(key, value); 154 } 155 } 156 } 157 | Popular Tags |