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.Function;
021    import com.google.common.util.concurrent.ExecutionError;
022    import com.google.common.util.concurrent.UncheckedExecutionException;
023    
024    import java.util.Map;
025    import java.util.concurrent.ConcurrentMap;
026    import java.util.concurrent.ExecutionException;
027    
028    /**
029     * A semi-persistent mapping from keys to values. Values are automatically loaded by the cache,
030     * and are stored in the cache until either evicted or manually invalidated.
031     *
032     * <p>All methods other than {@link #get} and {@link #getUnchecked} are optional.
033     *
034     * <p>When evaluated as a {@link Function}, a cache yields the same result as invoking {@link
035     * #getUnchecked}.
036     *
037     * @author Charles Fry
038     * @since 10.0
039     */
040    @Beta
041    public interface Cache<K, V> extends Function<K, V> {
042    
043      /**
044       * Returns the value associated with the given key, creating or retrieving that value if
045       * necessary, and throwing an execution exception on failure. No state associated with this cache
046       * is modified until loading completes. Note that this method will never return {@code null}.
047       *
048       * @throws ExecutionException if a checked exception was thrown while loading the response
049       * @throws UncheckedExecutionException if an unchecked exception was thrown while loading the
050       *     response
051       * @throws ExecutionError if an error was thrown while loading the response
052       */
053      V get(K key) throws ExecutionException;
054    
055      /**
056       * Returns the value associated with the given key, loading that value if necessary. No state
057       * associated with this cache is modified until computation completes. Unlike {@link #get}, this
058       * method does not throw a checked exception, and thus should only be used in situations where
059       * checked exceptions are not thrown by the cache loader. Note that this method will never return
060       * {@code null}.
061       *
062       * <p><b>Warning:</b> this method silently converts checked exceptions to unchecked exceptions.
063       * The {@link #get} method should be preferred for cache loaders which throw checked exceptions.
064       *
065       * @throws UncheckedExecutionException if an exception was thrown while loading the response,
066       *     regardless of whether the exception was checked or unchecked
067       * @throws ExecutionError if an error was thrown while loading the response
068       */
069      V getUnchecked(K key);
070    
071      /**
072       * Discouraged. Provided to satisfy the {@code Function} interface; use {@link #get} or
073       * {@link #getUnchecked} instead.
074       *
075       * @throws UncheckedExecutionException if an exception was thrown while loading the response,
076       *     regardless of whether the exception was checked or unchecked
077       * @throws ExecutionError if an error was thrown while loading the response
078       */
079      @Override
080      V apply(K key);
081    
082      // TODO(fry): add bulk operations
083    
084      /**
085       * Discards any cached value for key {@code key}, possibly asynchronously, so that a future
086       * invocation of {@code get(key)} will result in a cache miss and reload.
087       *
088       * @throws UnsupportedOperationException if this operation is not supported by the cache
089       *     implementation
090       */
091      void invalidate(Object key);
092    
093      /**
094       * Discards all entries in the cache, possibly asynchronously.
095       *
096       * @throws UnsupportedOperationException if this operation is not supported by the cache
097       *     implementation
098       */
099      void invalidateAll();
100    
101      /**
102       * Returns the approximate number of entries in this cache.
103       *
104       * @throws UnsupportedOperationException if this operation is not supported by the cache
105       *     implementation
106       */
107      long size();
108    
109      /**
110       * Returns a current snapshot of this cache's cumulative statistics. All stats are initialized
111       * to zero, and are monotonically increasing over the lifetime of the cache.
112       *
113       * @throws UnsupportedOperationException if this operation is not supported by the cache
114       *     implementation
115       */
116      CacheStats stats();
117    
118      /**
119       * Returns a view of the entries stored in this cache as a thread-safe map. Assume that none of
120       * the returned map's optional operations will be implemented, unless otherwise specified.
121       *
122       * <p>Operations on the returned map will never cause new values to be loaded into the cache. So,
123       * unlike {@link #get} and {@link #getUnchecked}, this map's {@link Map#get get} method will
124       * always return {@code null} for a key that is not already cached.
125       *
126       * @throws UnsupportedOperationException if this operation is not supported by the cache
127       *     implementation
128       */
129      ConcurrentMap<K, V> asMap();
130    
131      /**
132       * Performs any pending maintenance operations needed by the cache. Exactly which activities are
133       * performed -- if any -- is implementation-dependent.
134       */
135      void cleanUp();
136    }