001    /*
002     * Copyright 2010 The Guava Authors All Rights Reserved.
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.collect;
018    
019    import com.google.common.annotations.Beta;
020    import com.google.common.annotations.GwtCompatible;
021    import com.google.common.annotations.GwtIncompatible;
022    import com.google.common.base.Function;
023    
024    import java.util.concurrent.ConcurrentMap;
025    import java.util.concurrent.TimeUnit;
026    
027    /**
028     * A class exactly like {@link MapMaker}, except restricted in the types of maps
029     * it can build. This type is returned by {@link MapMaker#evictionListener} to
030     * prevent the user from trying to build a map that's incompatible with the key
031     * and value types of the listener.
032     *
033     * @param <K0> the base type for all key types of maps built by this map maker
034     * @param <V0> the base type for all value types of maps built by this map maker
035     * @author Kevin Bourrillion
036     * @since 7
037     */
038    @Beta
039    @GwtCompatible(emulated = true)
040    public abstract class GenericMapMaker<K0, V0> {
041      // Set by MapMaker, but sits in this class to preserve the type relationship
042      @GwtIncompatible("To be supported")
043      MapEvictionListener<K0, V0> evictionListener;
044    
045      // No subclasses but our own
046      GenericMapMaker() {}
047    
048      /**
049       * See {@link MapMaker#initialCapacity}.
050       */
051      public abstract GenericMapMaker<K0, V0> initialCapacity(int initialCapacity);
052    
053      /**
054       * See {@link MapMaker#maximumSize}.
055       *
056       * @since 8
057       */
058      @Beta
059      public abstract GenericMapMaker<K0, V0> maximumSize(int maximumSize);
060    
061      /**
062       * See {@link MapMaker#concurrencyLevel}.
063       */
064      @GwtIncompatible("java.util.concurrent.ConcurrentHashMap concurrencyLevel")
065      public abstract GenericMapMaker<K0, V0> concurrencyLevel(
066          int concurrencyLevel);
067    
068      /**
069       * See {@link MapMaker#weakKeys}.
070       */
071      @GwtIncompatible("java.lang.ref.WeakReference")
072      public abstract GenericMapMaker<K0, V0> weakKeys();
073    
074      /**
075       * See {@link MapMaker#softKeys}.
076       */
077      @GwtIncompatible("java.lang.ref.SoftReference")
078      public abstract GenericMapMaker<K0, V0> softKeys();
079    
080      /**
081       * See {@link MapMaker#weakValues}.
082       */
083      @GwtIncompatible("java.lang.ref.WeakReference")
084      public abstract GenericMapMaker<K0, V0> weakValues();
085    
086      /**
087       * See {@link MapMaker#softValues}.
088       */
089      @GwtIncompatible("java.lang.ref.SoftReference")
090      public abstract GenericMapMaker<K0, V0> softValues();
091    
092      /**
093       * See {@link MapMaker#expiration}.
094       */
095      // TODO(user): deprecate
096      public abstract GenericMapMaker<K0, V0> expiration(
097          long duration, TimeUnit unit);
098    
099      /**
100       * See {@link MapMaker#expireAfterWrite}.
101       *
102       * @since 8
103       */
104      @Beta
105      public abstract GenericMapMaker<K0, V0> expireAfterWrite(
106          long duration, TimeUnit unit);
107    
108      /**
109       * See {@link MapMaker#expireAfterAccess}.
110       *
111       * @since 8
112       */
113      @Beta
114      @GwtIncompatible("To be supported")
115      public abstract GenericMapMaker<K0, V0> expireAfterAccess(
116          long duration, TimeUnit unit);
117    
118      /*
119       * Note that MapMaker's evictionListener() is not here, because once you're
120       * interacting with a GenericMapMaker you've already called that, and
121       * shouldn't be calling it again.
122       */
123    
124      /**
125       * See {@link MapMaker#makeMap}.
126       */
127      public abstract <K extends K0, V extends V0> ConcurrentMap<K, V> makeMap();
128    
129      /**
130       * See {@link MapMaker#makeComputingMap}.
131       */
132      public abstract <K extends K0, V extends V0> ConcurrentMap<K, V>
133          makeComputingMap(Function<? super K, ? extends V> computingFunction);
134    }