001 /* 002 * Copyright (C) 2011 The Guava Authors 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017 package com.google.common.cache; 018 019 import com.google.common.annotations.Beta; 020 import com.google.common.base.Preconditions; 021 import com.google.common.collect.ForwardingObject; 022 023 import javax.annotation.Nullable; 024 025 import java.util.concurrent.ConcurrentMap; 026 import java.util.concurrent.ExecutionException; 027 028 /** 029 * A cache which forwards all its method calls to another cache. Subclasses should override one or 030 * more methods to modify the behavior of the backing cache as desired per the 031 * <a href="http://en.wikipedia.org/wiki/Decorator_pattern">decorator pattern</a>. 032 * 033 * <p>Note that {@link #get}, {@link #getUnchecked}, and {@link #apply} all expose the same 034 * underlying functionality, so should probably be overridden as a group. 035 * 036 * @author Charles Fry 037 * @since 10.0 038 */ 039 @Beta 040 public abstract class ForwardingCache<K, V> extends ForwardingObject implements Cache<K, V> { 041 042 /** Constructor for use by subclasses. */ 043 protected ForwardingCache() {} 044 045 @Override 046 protected abstract Cache<K, V> delegate(); 047 048 @Override 049 @Nullable 050 public V get(@Nullable K key) throws ExecutionException { 051 return delegate().get(key); 052 } 053 054 @Override 055 @Nullable 056 public V getUnchecked(@Nullable K key) { 057 return delegate().getUnchecked(key); 058 } 059 060 @Deprecated 061 @Override 062 @Nullable 063 public V apply(@Nullable K key) { 064 return delegate().apply(key); 065 } 066 067 @Override 068 public void invalidate(@Nullable Object key) { 069 delegate().invalidate(key); 070 } 071 072 @Override 073 public void invalidateAll() { 074 delegate().invalidateAll(); 075 } 076 077 @Override 078 public long size() { 079 return delegate().size(); 080 } 081 082 @Override 083 public CacheStats stats() { 084 return delegate().stats(); 085 } 086 087 @Override 088 public ConcurrentMap<K, V> asMap() { 089 return delegate().asMap(); 090 } 091 092 @Override 093 public void cleanUp() { 094 delegate().cleanUp(); 095 } 096 097 /** 098 * A simplified version of {@link ForwardingCache} where subclasses can pass in an already 099 * constructed {@link Cache} as the delegete. 100 * 101 * @since 10.0 102 */ 103 @Beta 104 public abstract static class SimpleForwardingCache<K, V> extends ForwardingCache<K, V> { 105 private final Cache<K, V> delegate; 106 107 protected SimpleForwardingCache(Cache<K, V> delegate) { 108 this.delegate = Preconditions.checkNotNull(delegate); 109 } 110 111 @Override 112 protected final Cache<K, V> delegate() { 113 return delegate; 114 } 115 } 116 }