Home | History | Annotate | Download | only in impl
      1 /*
      2  ****************************************************************************
      3  * Copyright (c) 2007-2009 International Business Machines Corporation and  *
      4  * others.  All rights reserved.                                            *
      5  ****************************************************************************
      6  */
      7 
      8 package com.ibm.icu.impl;
      9 
     10 import java.lang.ref.Reference;
     11 import java.lang.ref.SoftReference;
     12 import java.lang.ref.WeakReference;
     13 import java.util.Collections;
     14 import java.util.HashMap;
     15 import java.util.Map;
     16 
     17 public class SimpleCache<K, V> implements ICUCache<K, V> {
     18     private static final int DEFAULT_CAPACITY = 16;
     19 
     20     private Reference<Map<K, V>> cacheRef = null;
     21     private int type = ICUCache.SOFT;
     22     private int capacity = DEFAULT_CAPACITY;
     23 
     24     public SimpleCache() {
     25     }
     26 
     27     public SimpleCache(int cacheType) {
     28         this(cacheType, DEFAULT_CAPACITY);
     29     }
     30 
     31     public SimpleCache(int cacheType, int initialCapacity) {
     32         if (cacheType == ICUCache.WEAK) {
     33             type = cacheType;
     34         }
     35         if (initialCapacity > 0) {
     36             capacity = initialCapacity;
     37         }
     38     }
     39 
     40     public V get(Object key) {
     41         Reference<Map<K, V>> ref = cacheRef;
     42         if (ref != null) {
     43             Map<K, V> map = ref.get();
     44             if (map != null) {
     45                 return map.get(key);
     46             }
     47         }
     48         return null;
     49     }
     50 
     51     public void put(K key, V value) {
     52         Reference<Map<K, V>> ref = cacheRef;
     53         Map<K, V> map = null;
     54         if (ref != null) {
     55             map = ref.get();
     56         }
     57         if (map == null) {
     58             map = Collections.synchronizedMap(new HashMap<K, V>(capacity));
     59             if (type == ICUCache.WEAK) {
     60                 ref = new WeakReference<Map<K, V>>(map);
     61             } else {
     62                 ref = new SoftReference<Map<K, V>>(map);
     63             }
     64             cacheRef = ref;
     65         }
     66         map.put(key, value);
     67     }
     68 
     69     public void clear() {
     70         cacheRef = null;
     71     }
     72 
     73 }
     74