Класс ClassValue<T>
- Параметры типа:
T— тип связанного значения
public abstract class ClassValue<T> extends Object
Class. Например, если динамическому языку необходимо создать таблицу диспетчеризации сообщений для каждого класса, встреченного в точке вызова отправки сообщения, он может использовать ClassValue для кэширования информации, необходимой для быстрой отправки сообщения для каждого встреченного класса. Основная операция ClassValue — это get, которая возвращает связанное значение, изначально созданное вызовом computeValue; при гонке может произойти несколько вызовов, но с Class связывается и возвращается ровно одно значение.
Другая операция — remove: она очищает связанное значение (если оно существует) и гарантирует, что следующее связанное значение будет вычислено с использованием актуальных входных состояний с учётом удаления.
Для определённой связи доступы к связанному значению имеют полный порядок. Доступы атомарны; к ним относятся:
- Доступ только для чтения со стороны
get - Попытка связать возвращаемое значение
computeValueсо стороныget - Очистка связи со стороны
remove
get всегда включает как минимум один доступ; вызов remove всегда включает ровно один доступ; вызов computeValue всегда происходит между двумя доступами. Это устанавливает порядок вызовов computeValue относительно вызовов remove и определяет, могут ли результаты computeValue быть успешно связаны вызовом
get.- С момента:
- 1.7
Краткое описание конструкторов
| Модификатор | Конструктор | Описание |
|---|---|---|
protected |
Единственный конструктор. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
protected abstract T |
computeValue |
Вычисляет значение, связываемое с заданным Class. |
T |
get |
Возвращает значение, связанное с заданным Class. |
void |
remove |
Удаляет связанное значение для заданного Class и аннулирует все устаревшие вычисления. |
Подробное описание конструкторов
ClassValue
protected ClassValue()
Подробное описание методов
computeValue
protected abstract T computeValue(Class<?> type)
Class. Этот метод вызывается, когда при первоначальном доступе только для чтения через get не обнаруживается связанного значения.
Если этот метод выбрасывает исключение, инициирующий вызов get не будет пытаться связать значение и может завершиться возвратом связанного значения, если оно существует, либо распространением этого исключения в противном случае.
В противном случае значение вычисляется и возвращается. Предпринимается попытка связать возвращённое значение, которая может завершиться одним из следующих способов:
- Связанное значение присутствует; оно возвращается, и связывание не выполняется.
- Последний вызов
remove, если он был, не происходит до завершения вызоваcomputeValue, вычислившего связываемое значение, в смысле отношения happens-before (JLS 17.4.5). Новый вызовcomputeValue, которому предшествует вызовremoveв смысле happens-before, восстановит это отношение happens-before. - В противном случае это значение успешно связывается и возвращается.
- Примечание API:
- Вызов
computeValueможет из-за загрузки классов или других обстоятельств рекурсивно вызватьgetилиremoveдля того жеtype. Рекурсивный вызовget, если рекурсия прекращается, успешно завершается, и инициирующий вызовgetполучает связанное значение из рекурсии. Рекурсивный вызовremoveничего не делает, поскольку выполняется в том же потоке, а вызовremoveуже предшествует завершению этого вызоваcomputeValueв смысле happens-before; результат этого вызоваcomputeValueвсё ещё может быть связан. - Параметры:
-
type—Class, с которым связывается значение - Возвращает:
- новое вычисленное значение для связывания
- См. также:
get
public T get(Class<?> type)
Class. Этот метод сначала выполняет доступ только для чтения и возвращает связанное значение, если оно существует. В противном случае метод пытается связать значение из вызова computeValue, пока связанное значение не появится; его может связать конкурирующий поток.
Этот метод может выбросить исключение из вызова computeValue. В этом случае связывание не происходит.
- Параметры:
-
type—Class, для которого требуется получить связанное значение - Возвращает:
- значение, связанное с заданным
Class - Выбрасывает:
-
NullPointerException— если аргумент равенnull - См. также:
remove
public void remove(Class<?> type)
Class и аннулирует все устаревшие вычисления. Если к этой связи впоследствии обращаются, это удаление предшествует завершению вызова computeValue, вернувшего связанное значение, в смысле отношения happens-before (JLS 17.4.5).- Параметры:
-
type— тип, значение класса которого необходимо удалить - Выбрасывает:
-
NullPointerException— если аргумент равенnull
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/ClassValue.html