Spec-Zone.ru › OpenJDK 25

Класс ClassValue<T>

java.lang.Object
java.lang.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

Краткое описание конструкторов

ClassValue()
Модификатор Конструктор Описание
protected
Единственный конструктор.

Краткое описание методов

Модификатор и тип Метод Описание
protected abstract T computeValue(Class<?> type)
Вычисляет значение, связываемое с заданным Class.
T get(Class<?> type)
Возвращает значение, связанное с заданным Class.
void remove(Class<?> type)
Удаляет связанное значение для заданного Class и аннулирует все устаревшие вычисления.

Методы, объявленные в классе Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Подробное описание конструкторов

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(Class)
  • remove(Class)

get

public T get(Class<?> type)
Возвращает значение, связанное с заданным Class.

Этот метод сначала выполняет доступ только для чтения и возвращает связанное значение, если оно существует. В противном случае метод пытается связать значение из вызова computeValue, пока связанное значение не появится; его может связать конкурирующий поток.

Этот метод может выбросить исключение из вызова computeValue. В этом случае связывание не происходит.

Параметры:
type — Class, для которого требуется получить связанное значение
Возвращает:
значение, связанное с заданным Class
Выбрасывает:
NullPointerException — если аргумент равен null
См. также:
  • remove(Class)
  • computeValue(Class)

remove

public void remove(Class<?> type)
Удаляет связанное значение для заданного Class и аннулирует все устаревшие вычисления. Если к этой связи впоследствии обращаются, это удаление предшествует завершению вызова computeValue, вернувшего связанное значение, в смысле отношения happens-before (JLS 17.4.5).
Параметры:
type — тип, значение класса которого необходимо удалить
Выбрасывает:
NullPointerException — если аргумент равен null

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в разделе Документация Java SE, содержащем более подробные описания для разработчиков, концептуальные обзоры, определения терминов, обходные решения и примеры работающего кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её аффилированных лиц в США и других странах.
Авторское право © 1993, 2025, Oracle и/или её аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API