类LocalManualCache

类LocalManualCache是类LocalCache的内部类。

类定义

class LocalCache {
      static class LocalManualCache<K, V> implements Cache<K, V>, Serializable {}
}

注: LocalManualCache直接实现了Cache,而不是从AbstractCache继承,有些奇怪: 那AbstractCache写来给谁用呢?

构造函数

LocalLoadingCache(CacheBuilder<? super K, ? super V> builder,
    CacheLoader<? super K, V> loader) {
  super(new LocalCache<K, V>(builder, checkNotNull(loader)));
}

方法实现

简单委托给localcache的方法

以下方法都是将实现简单委托给localcache的同名方法:

  • getIfPresent()
  • getAllPresent()
  • put()
  • putAll()
  • invalidateAll
  • cleanUp()

代码典型如下:

@Override
@Nullable
public V getIfPresent(Object key) {
    // 直接委托给 localCache 的 getIfPresent()方法。
    return localCache.getIfPresent(key);
}

稍作变化再委托给localcache的方法

以下方法是稍作变化再委托给localcache的方法,有些只是方法名不同而已:

  • get()
  • invalidate()
  • invalidateAll()

具体如下:

@Override
public V get(K key, final Callable<? extends V> valueLoader) throws ExecutionException {
  checkNotNull(valueLoader);
  // 委托给localCache的get(key, CacheLoader)方法
  return localCache.get(key, new CacheLoader<Object, V>() {
    @Override
    public V load(Object key) throws Exception {
      // 通过一个内部匿名类将Callable转为CacheLoader
      return valueLoader.call();
    }
  });
}

@Override
public void invalidate(Object key) {
  checkNotNull(key);
  //委托给localCache的remove方法
  localCache.remove(key);
}

@Override
public void invalidateAll() {
  localCache.clear();
}

public long size() {
  return localCache.longSize();
}

asMap()方法

@Override
public ConcurrentMap<K, V> asMap() {
  // 直接把localcache这个map返回了
  return localCache;
}

stats()方法

@Override
public CacheStats stats() {
  SimpleStatsCounter aggregator = new SimpleStatsCounter();
  // 先加上localCache的globalStatsCounter
  aggregator.incrementBy(localCache.globalStatsCounter);
  for (Segment<K, V> segment : localCache.segments) {
    // 再将各个segment的statsCounter累加起来
    aggregator.incrementBy(segment.statsCounter);
  }
  //最后得到当前的快照
  return aggregator.snapshot();
}

writeReplace()方法

Object writeReplace() {
  return new ManualSerializationProxy<K, V>(localCache);
}

TBD:再细看。

results matching ""

    No results matching ""