|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object com.google.common.collect.GenericMapMaker<Object,Object> com.google.common.collect.MapMaker
@GwtCompatible(emulated=true) public final class MapMaker
A ConcurrentMap
builder, providing any combination of these
features: soft or weak keys, soft or weak values, size-based evicition, timed expiration, and
on-demand computation of values. Usage example:
ConcurrentMap<Key, Graph> graphs = new MapMaker()
.concurrencyLevel(4)
.softKeys()
.weakValues()
.maximumSize(10000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.makeComputingMap(
new Function<Key, Graph>() {
public Graph apply(Key key) {
return createExpensiveGraph(key);
}
});
These features are all optional; new MapMaker().makeMap()
returns a valid concurrent map that behaves exactly like a
ConcurrentHashMap
.
The returned map is implemented as a hash table with similar performance
characteristics to ConcurrentHashMap
. It supports all optional
operations of the ConcurrentMap
interface. It does not permit
null keys or values.
Note: by default, the returned map uses equality comparisons
(the equals
method) to determine equality
for keys or values. However, if weakKeys()
or softKeys()
was specified, the map uses identity (==
)
comparisons instead for keys. Likewise, if weakValues()
or
softValues()
was specified, the map uses identity comparisons
for values.
The returned map has weakly consistent iteration: an iterator over one of the map's view collections may reflect some, all or none of the changes made to the map after the iterator was created.
An entry whose key or value is reclaimed by the garbage collector
immediately disappears from the map. (If the default settings of strong
keys and strong values are used, this will never happen.) The client can
never observe a partially-reclaimed entry. Any Map.Entry
instance retrieved from the map's entry set
is a snapshot of that entry's state at the time of retrieval; such entries
do, however, support Map.Entry.setValue(V)
.
The maps produced by MapMaker
are serializable, and the
deserialized maps retain all the configuration properties of the original
map. If the map uses soft or weak references, the entries will be
reconstructed as they were, but there is no guarantee that the entries won't
be immediately reclaimed.
new MapMaker().weakKeys().makeMap()
can almost always be
used as a drop-in replacement for WeakHashMap
, adding
concurrency, asynchronous cleanup, identity-based equality for keys, and
great flexibility.
Constructor Summary | |
---|---|
MapMaker()
Constructs a new MapMaker instance with default settings,
including strong keys, strong values, and no automatic expiration. |
Method Summary | ||
---|---|---|
MapMaker |
concurrencyLevel(int concurrencyLevel)
Guides the allowed concurrency among update operations. |
|
|
evictionListener(MapEvictionListener<K,V> listener)
Specifies a listener instance, which all maps built using this MapMaker will notify each time an entry is evicted. |
|
MapMaker |
expiration(long duration,
TimeUnit unit)
Deprecated. use expireAfterWrite(long, java.util.concurrent.TimeUnit) , which behaves exactly the same.
This method is scheduled for deletion in July 2012. |
|
MapMaker |
expireAfterAccess(long duration,
TimeUnit unit)
Specifies that each entry should be automatically removed from the map once a fixed duration has passed since the entry's last read or write access. |
|
MapMaker |
expireAfterWrite(long duration,
TimeUnit unit)
Specifies that each entry should be automatically removed from the map once a fixed duration has passed since the entry's creation or replacement. |
|
MapMaker |
initialCapacity(int initialCapacity)
Sets a custom initial capacity (defaults to 16). |
|
|
makeComputingMap(Function<? super K,? extends V> computingFunction)
Builds a map that supports atomic, on-demand computation of values. |
|
|
makeMap()
Builds a map, without on-demand computation of values. |
|
MapMaker |
maximumSize(int size)
Specifies the maximum number of entries the map may contain. |
|
MapMaker |
softKeys()
Specifies that each key (not value) stored in the map should be wrapped in a SoftReference (by default, strong references
are used). |
|
MapMaker |
softValues()
Specifies that each value (not key) stored in the map should be wrapped in a SoftReference (by default, strong references
are used). |
|
String |
toString()
Returns a string representation for this MapMaker instance. |
|
MapMaker |
weakKeys()
Specifies that each key (not value) stored in the map should be wrapped in a WeakReference (by default, strong references
are used). |
|
MapMaker |
weakValues()
Specifies that each value (not key) stored in the map should be wrapped in a WeakReference (by default, strong references
are used). |
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
Constructor Detail |
---|
public MapMaker()
MapMaker
instance with default settings,
including strong keys, strong values, and no automatic expiration.
Method Detail |
---|
public MapMaker initialCapacity(int initialCapacity)
initialCapacity
in class GenericMapMaker<Object,Object>
IllegalArgumentException
- if initialCapacity
is
negative
IllegalStateException
- if an initial capacity was already set@Beta public MapMaker maximumSize(int size)
When size
is zero, elements can be successfully added to the
map, but are evicted immediately.
maximumSize
in class GenericMapMaker<Object,Object>
size
- the maximum size of the map
IllegalArgumentException
- if size
is negative
IllegalStateException
- if a maximum size was already set@GwtIncompatible(value="java.util.concurrent.ConcurrentHashMap concurrencyLevel") public MapMaker concurrencyLevel(int concurrencyLevel)
Note: Prior to Guava release 09, the default was 16. It is possible the default will change again in the future. If you care about this value, you should always choose it explicitly.
concurrencyLevel
in class GenericMapMaker<Object,Object>
IllegalArgumentException
- if concurrencyLevel
is
nonpositive
IllegalStateException
- if a concurrency level was already set@GwtIncompatible(value="java.lang.ref.WeakReference") public MapMaker weakKeys()
WeakReference
(by default, strong references
are used).
Note: the map will use identity (==
) comparison
to determine equality of weak keys, which may not behave as you expect.
For example, storing a key in the map and then attempting a lookup
using a different but equals
-equivalent
key will always fail.
weakKeys
in class GenericMapMaker<Object,Object>
IllegalStateException
- if the key strength was already setWeakReference
@GwtIncompatible(value="java.lang.ref.SoftReference") public MapMaker softKeys()
SoftReference
(by default, strong references
are used).
Note: the map will use identity (==
) comparison
to determine equality of soft keys, which may not behave as you expect.
For example, storing a key in the map and then attempting a lookup
using a different but equals
-equivalent
key will always fail.
softKeys
in class GenericMapMaker<Object,Object>
IllegalStateException
- if the key strength was already setSoftReference
@GwtIncompatible(value="java.lang.ref.WeakReference") public MapMaker weakValues()
WeakReference
(by default, strong references
are used).
Weak values will be garbage collected once they are weakly
reachable. This makes them a poor candidate for caching; consider
softValues()
instead.
Note: the map will use identity (==
) comparison
to determine equality of weak values. This will notably impact
the behavior of containsValue
,
remove(Object, Object)
,
and replace(K, V, V)
.
weakValues
in class GenericMapMaker<Object,Object>
IllegalStateException
- if the value strength was already setWeakReference
@GwtIncompatible(value="java.lang.ref.SoftReference") public MapMaker softValues()
SoftReference
(by default, strong references
are used).
Soft values will be garbage collected in response to memory demand, and in a least-recently-used manner. This makes them a good candidate for caching.
Note: the map will use identity (==
) comparison
to determine equality of soft values. This will notably impact
the behavior of containsValue
,
remove(Object, Object)
,
and replace(K, V, V)
.
softValues
in class GenericMapMaker<Object,Object>
IllegalStateException
- if the value strength was already setSoftReference
@Deprecated public MapMaker expiration(long duration, TimeUnit unit)
expireAfterWrite(long, java.util.concurrent.TimeUnit)
, which behaves exactly the same.
This method is scheduled for deletion in July 2012.
expireAfterWrite(long, java.util.concurrent.TimeUnit)
.
expiration
in class GenericMapMaker<Object,Object>
@Beta public MapMaker expireAfterWrite(long duration, TimeUnit unit)
When duration
is zero, elements can be successfully added to the
map, but are evicted immediately.
expireAfterWrite
in class GenericMapMaker<Object,Object>
duration
- the length of time after an entry is created that it
should be automatically removedunit
- the unit that duration
is expressed in
IllegalArgumentException
- if duration
is negative
IllegalStateException
- if the time to live or time to idle was
already set@Beta @GwtIncompatible(value="To be supported") public MapMaker expireAfterAccess(long duration, TimeUnit unit)
When duration
is zero, elements can be successfully added to the
map, but are evicted immediately.
expireAfterAccess
in class GenericMapMaker<Object,Object>
duration
- the length of time after an entry is last accessed
that it should be automatically removedunit
- the unit that duration
is expressed in
IllegalArgumentException
- if duration
is negative
IllegalStateException
- if the time to idle or time to live was
already set@Beta @GwtIncompatible(value="To be supported") public <K,V> GenericMapMaker<K,V> evictionListener(MapEvictionListener<K,V> listener)
MapMaker
will notify each time an entry is evicted.
A map built by this map maker will invoke the supplied listener after it evicts an entry, whether it does so due to timed expiration, exceeding the maximum size, or discovering that the key or value has been reclaimed by the garbage collector. It will invoke the listener synchronously, during invocations of any of that map's public methods (even read-only methods). The listener will not be invoked on manual removal.
Important note: Instead of returning this as a MapMaker
instance, this method returns GenericMapMaker<K, V>
.
From this point on, either the original reference or the returned
reference may be used to complete configuration and build the map, but only
the "generic" one is type-safe. That is, it will properly prevent you from
building maps whose key or value types are incompatible with the types
accepted by the listener already provided; the MapMaker
type cannot
do this. For best results, simply use the standard method-chaining idiom,
as illustrated in the documentation at top, configuring a MapMaker
and building your Map
all in a single statement.
Warning: if you ignore the above advice, and use this MapMaker
to build maps whose key or value types are incompatible with the
listener, you will likely experience a ClassCastException
at an
undefined point in the future.
IllegalStateException
- if an eviction listener was already setpublic <K,V> ConcurrentMap<K,V> makeMap()
MapMaker
instance, so it can be
invoked again to create multiple independent maps.
makeMap
in class GenericMapMaker<Object,Object>
public <K,V> ConcurrentMap<K,V> makeComputingMap(Function<? super K,? extends V> computingFunction)
Map.get(java.lang.Object)
either returns an already-computed value for the given key,
atomically computes it using the supplied function, or, if another thread
is currently computing the value for this key, simply waits for that thread
to finish and returns its computed value. Note that the function may be
executed concurrently by multiple threads, but only for distinct keys.
If an entry's value has not finished computing yet, query methods
besides get
return immediately as if an entry doesn't exist. In
other words, an entry isn't externally visible until the value's
computation completes.
Map.get(java.lang.Object)
on the returned map will never return null
. It
may throw:
NullPointerException
if the key is null or the computing
function returns null
ComputationException
if an exception was thrown by the
computing function. If that exception is already of type ComputationException
it is propagated directly; otherwise it is
wrapped.
Note: Callers of get
must ensure that the key
argument is of type K
. The get
method accepts Object
, so the key type is not checked at compile time. Passing an object
of a type other than K
can result in that object being unsafely
passed to the computing function as type K
, and unsafely stored in
the map.
If Map.put(K, V)
is called before a computation completes, other
threads waiting on the computation will wake up and return the stored
value.
This method does not alter the state of this MapMaker
instance,
so it can be invoked again to create multiple independent maps.
makeComputingMap
in class GenericMapMaker<Object,Object>
computingFunction
- the function used to compute new values
public String toString()
toString
in class Object
|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |