ClassValue
public
abstract
class
ClassValue
extends Object
| java.lang.Object | |
| ↳ | java.lang.ClassValue<T> |
Lazily associate a computed value with any Class object.
For example, if a dynamic language needs to construct a message dispatch
table for each class encountered at a message send call site,
it can use a ClassValue to cache information needed to
perform the message send quickly, for each class encountered.
The basic operation of a ClassValue is get, which
returns the associated value, initially created by an invocation to computeValue; multiple invocations may happen under race, but
exactly one value is associated to a Class and returned.
Another operation is remove: it clears the associated value
(if it exists), and ensures the next associated value is computed with input
states up-to-date with the removal.
For a particular association, there is a total order for accesses to the associated value. Accesses are atomic; they include:
- A read-only access by
get - An attempt to associate the return value of a
computeValuebyget - Clearing of an association by
remove
get call always include at least one access; a remove call
always has exactly one access; a computeValue call always happens
between two accesses. This establishes the order of computeValue
calls with respect to remove calls and determines whether the
results of a computeValue can be successfully associated by a get.
Summary
Protected constructors | |
|---|---|
ClassValue()
Sole constructor. |
|
Public methods | |
|---|---|
T
|
get(Class<?> type)
This method first performs a read-only access, and returns the associated value if it exists. |
void
|
remove(Class<?> type)
Removes the associated value for the given |
Protected methods | |
|---|---|
abstract
T
|
computeValue(Class<?> type)
Computes the value to associate to the given |
Inherited methods | |
|---|---|
Protected constructors
ClassValue
protected ClassValue ()
Sole constructor. (For invocation by subclass constructors, typically implicit.)
Public methods
get
public T get (Class<?> type)
This method first performs a read-only access, and returns the associated
value if it exists. Otherwise, this method tries to associate a value
from a computeValue invocation until the associated
value exists, which could be associated by a competing thread.
This method may throw an exception from a computeValue invocation.
In this case, no association happens.
| Parameters | |
|---|---|
type |
Class: the Class to retrieve the associated value for |
| Returns | |
|---|---|
T |
the value associated to the given Class |
| Throws | |
|---|---|
NullPointerException |
if the argument is null |
See also:
remove
public void remove (Class<?> type)
Removes the associated value for the given Class and invalidates
all out-of-date computations. If this association is subsequently
accessed, this removal happens-before (JLS {@jls 17.4.5}) the finish of the computeValue call that
returned the associated value.
| Parameters | |
|---|---|
type |
Class: the type whose class value must be removed |
| Throws | |
|---|---|
NullPointerException |
if the argument is null |
Protected methods
computeValue
protected abstract T computeValue (Class<?> type)
Computes the value to associate to the given Class.
This method is invoked when the initial read-only access by get finds no associated value.
If this method throws an exception, the initiating get call will
not attempt to associate a value, and may terminate by returning the
associated value if it exists, or by propagating that exception otherwise.
Otherwise, the value is computed and returned. An attempt to associate the return value happens, with one of the following outcomes:
- The associated value is present; it is returned and no association is done.
- The most recent
removecall, if it exists, does not happen-before (JLS {@jls 17.4.5}) the finish of thecomputeValuethat computed the value to associate. A new invocation tocomputeValue, which thatremovecall happens-before, will re-establish this happens-before relationship. - Otherwise, this value is successfully associated and returned.
API Note:
- A
computeValuecall may, due to class loading or other circumstances, recursively callgetorremovefor the sametype. The recursiveget, if the recursion stops, successfully finishes and this initiatinggetobserves the associated value from recursion. The recursiveremoveis no-op, since being on the same thread, theremovealready happens-before the finish of thiscomputeValue; the result from thiscomputeValuestill may be associated.
| Parameters | |
|---|---|
type |
Class: the Class to associate a value to |
| Returns | |
|---|---|
T |
the newly computed value to associate |
See also: