001/*
002 * Copyright (C) 2010 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
017package com.google.common.collect;
018
019import com.google.common.annotations.Beta;
020import com.google.common.annotations.GwtCompatible;
021import com.google.common.annotations.GwtIncompatible;
022import com.google.common.base.Equivalence;
023import com.google.common.base.Function;
024import com.google.common.base.Objects;
025import com.google.common.collect.MapMaker.RemovalListener;
026import com.google.common.collect.MapMaker.RemovalNotification;
027
028import java.util.concurrent.ConcurrentMap;
029import java.util.concurrent.TimeUnit;
030
031/**
032 * A class exactly like {@link MapMaker}, except restricted in the types of maps it can build.
033 * For the most part, you should probably just ignore the existence of this class.
034 *
035 * @param <K0> the base type for all key types of maps built by this map maker
036 * @param <V0> the base type for all value types of maps built by this map maker
037 * @author Kevin Bourrillion
038 * @since 7.0
039 */
040@Beta
041@GwtCompatible(emulated = true)
042public abstract class GenericMapMaker<K0, V0> {
043  @GwtIncompatible("To be supported")
044  enum NullListener implements RemovalListener<Object, Object> {
045    INSTANCE;
046
047    @Override
048    public void onRemoval(RemovalNotification<Object, Object> notification) {}
049  }
050
051  // Set by MapMaker, but sits in this class to preserve the type relationship
052  @GwtIncompatible("To be supported")
053  RemovalListener<K0, V0> removalListener;
054
055  // No subclasses but our own
056  GenericMapMaker() {}
057
058  /**
059   * See {@link MapMaker#keyEquivalence}.
060   */
061  @GwtIncompatible("To be supported")
062  abstract GenericMapMaker<K0, V0> keyEquivalence(Equivalence<Object> equivalence);
063
064  /**
065   * See {@link MapMaker#initialCapacity}.
066   */
067  public abstract GenericMapMaker<K0, V0> initialCapacity(int initialCapacity);
068
069  /**
070   * See {@link MapMaker#maximumSize}.
071   */
072  abstract GenericMapMaker<K0, V0> maximumSize(int maximumSize);
073
074  /**
075   * See {@link MapMaker#concurrencyLevel}.
076   */
077  public abstract GenericMapMaker<K0, V0> concurrencyLevel(int concurrencyLevel);
078
079  /**
080   * See {@link MapMaker#weakKeys}.
081   */
082  @GwtIncompatible("java.lang.ref.WeakReference")
083  public abstract GenericMapMaker<K0, V0> weakKeys();
084
085  /**
086   * See {@link MapMaker#softKeys}.
087   */
088  @Deprecated
089  @GwtIncompatible("java.lang.ref.SoftReference")
090  public abstract GenericMapMaker<K0, V0> softKeys();
091
092  /**
093   * See {@link MapMaker#weakValues}.
094   */
095  @GwtIncompatible("java.lang.ref.WeakReference")
096  public abstract GenericMapMaker<K0, V0> weakValues();
097
098  /**
099   * See {@link MapMaker#softValues}.
100   */
101  @GwtIncompatible("java.lang.ref.SoftReference")
102  public abstract GenericMapMaker<K0, V0> softValues();
103
104  /**
105   * See {@link MapMaker#expireAfterWrite}.
106   */
107  abstract GenericMapMaker<K0, V0> expireAfterWrite(long duration, TimeUnit unit);
108
109  /**
110   * See {@link MapMaker#expireAfterAccess}.
111   */
112  @GwtIncompatible("To be supported")
113  abstract GenericMapMaker<K0, V0> expireAfterAccess(long duration, TimeUnit unit);
114
115  /*
116   * Note that MapMaker's removalListener() is not here, because once you're interacting with a
117   * GenericMapMaker you've already called that, and shouldn't be calling it again.
118   */
119
120  @SuppressWarnings("unchecked") // safe covariant cast
121  @GwtIncompatible("To be supported")
122  <K extends K0, V extends V0> RemovalListener<K, V> getRemovalListener() {
123    return (RemovalListener<K, V>) Objects.firstNonNull(removalListener, NullListener.INSTANCE);
124  }
125
126  /**
127   * See {@link MapMaker#makeMap}.
128   */
129  public abstract <K extends K0, V extends V0> ConcurrentMap<K, V> makeMap();
130
131  /**
132   * See {@link MapMaker#makeCustomMap}.
133   */
134  @GwtIncompatible("MapMakerInternalMap")
135  abstract <K, V> MapMakerInternalMap<K, V> makeCustomMap();
136
137  /**
138   * See {@link MapMaker#makeComputingMap}.
139   */
140  @Deprecated
141  public abstract <K extends K0, V extends V0> ConcurrentMap<K, V> makeComputingMap(
142      Function<? super K, ? extends V> computingFunction);
143}