ClassValue в Java 7 - PullRequest
       5

ClassValue в Java 7

35 голосов
/ 16 сентября 2011

При просмотре документации по API Java 7 я наткнулся на новый класс java.lang.ClassValue со следующей довольно минимальной документацией:

Лениво связывает вычисленное значение с (потенциально) каждым типом. Например, если динамический язык должен построить таблицу отправки сообщений для каждого класса, обнаруженного на сайте вызова для отправки сообщений, он может использовать ClassValue для кэширования информации, необходимой для быстрой отправки сообщения, для каждого встреченного класса.

Может кто-нибудь дать лучшее объяснение, какую проблему решает этот класс, и, возможно, какой-нибудь пример кода или проекта с открытым исходным кодом, который уже использует этот класс?

Обновление: Я все еще заинтересован в некотором фактическом исходном коде или примерах, использующих этот новый класс.

Я также нашел это письмо в списке рассылки mlvm-dev относительно некоторых улучшений реализации. Очевидно, он был изменен с использования WeakHashMap на новое приватное поле на java.lang.Class, чтобы сделать его более масштабируемым.

Ответы [ 4 ]

11 голосов
/ 31 мая 2013

Лучшее объяснение цели этого класса состоит в том, что он решает Java Bug 6389107

Есть много случаев использования, когда по какой-то причине кто-то хочет иметь Map<Class<?>, T>, но это вызывает всевозможные проблемы, так как объекты Class не будут в состоянии GC, пока карта не будет. WeakHashMap<Class<?>, T> не решает проблему, потому что очень часто T ссылается на класс.

Вышеприведенная ошибка входит в гораздо более подробное объяснение и содержит примеры проектов / кода, которые сталкиваются с этой проблемой.

ClassValue является ответом на эту проблему. Потоково-безопасный загрузчик / выгрузка classloader безопасный способ связать данные с Class.

6 голосов
/ 16 сентября 2011

Его цель - разрешить добавление информации времени выполнения к произвольным целевым классам ( ссылка ).

Я думаю, что это больше нацелено на программистов с динамическим языком. Я не уверен, насколько это будет полезно для разработчиков общих приложений.

Изначально класс был в пакете java.dyn. Эта ошибка показывает, что она переходит на java.lang.

1 голос
/ 02 декабря 2015

ClassValue кеширует что-то о классе.вот часть кода (в lucene 5.0 AttributeSource.java)

/** a cache that stores all interfaces for known implementation classes for performance (slow reflection) */
  private static final ClassValue<Class<? extends Attribute>[]> implInterfaces = new ClassValue<Class<? extends Attribute>[]>() {
@Override
protected Class<? extends Attribute>[] computeValue(Class<?> clazz) {
  final Set<Class<? extends Attribute>> intfSet = new LinkedHashSet<>();
  // find all interfaces that this attribute instance implements
  // and that extend the Attribute interface
  do {
    for (Class<?> curInterface : clazz.getInterfaces()) {
      if (curInterface != Attribute.class && Attribute.class.isAssignableFrom(curInterface)) {
        intfSet.add(curInterface.asSubclass(Attribute.class));
      }
    }
    clazz = clazz.getSuperclass();
  } while (clazz != null);
  @SuppressWarnings({"unchecked", "rawtypes"}) final Class<? extends Attribute>[] a =
      intfSet.toArray(new Class[intfSet.size()]);
  return a;
}
};
1 голос
/ 16 сентября 2011

Ну, это абстрактный класс.Я нашел копию .Посмотрите на это.

...