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 }