Производительность Java при использовании класса в качестве ключа карты

Итак, в основном я пытался создать карту для сортировки элементов, используя их собственный тип, а затем иметь возможность извлекать их, используя этот тип, при этом имея возможность одновременно удерживать только один элемент каждого типа. Для этого я решил использовать Map<Class<? extends ParentClass>, ParentClass>.

Я думаю, что в Java это называется гетерогенным контейнером (см. это), но затем я начал думать о проблемах с производительностью (потому что мне просто любопытно, я не думаю, что когда-нибудь увижу разницу, но кто знает). Поэтому вместо того, чтобы хранить свои объекты с помощью ChildClass.class, я собирался объявить некоторую переменную идентификатора в каждом объявлении класса всех моих дочерних классов, но у меня не было бы возможности принудительно применить его объявление, потому что оно должно быть статическим.

Следует ли мне продолжать использовать .class в качестве ключей карты?

Спасибо.

Почему объект Class должен работать хуже, чем объект гипотетического идентификатора?

Holger 09.04.2021 17:49

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

dylanbatio 09.04.2021 17:55

Как способ создания экземпляров значений соотносится с заданным вами вопросом о ключевой тип карты?

Holger 09.04.2021 18:04
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
18
1

Ответы 1

Классы часто используются в качестве ключей карты.

См., Например, JTree.createDefaultRenderers():

protected void createDefaultRenderers() {
  defaultRenderersByColumnClass = new UIDefaults(8, 0.75f);

  // Objects
  defaultRenderersByColumnClass.put(Object.class, (UIDefaults.LazyValue) t -> new DefaultTableCellRenderer.UIResource());

  // Numbers
  defaultRenderersByColumnClass.put(Number.class, (UIDefaults.LazyValue) t -> new NumberRenderer());

  // Doubles and Floats
  defaultRenderersByColumnClass.put(Float.class, (UIDefaults.LazyValue) t -> new DoubleRenderer());
  defaultRenderersByColumnClass.put(Double.class, (UIDefaults.LazyValue) t -> new DoubleRenderer());

  // Dates
  defaultRenderersByColumnClass.put(Date.class, (UIDefaults.LazyValue) t -> new DateRenderer());

  // Icons and ImageIcons
  defaultRenderersByColumnClass.put(Icon.class, (UIDefaults.LazyValue) t -> new IconRenderer());
  defaultRenderersByColumnClass.put(ImageIcon.class, (UIDefaults.LazyValue) t -> new IconRenderer());

  // Booleans
  defaultRenderersByColumnClass.put(Boolean.class, (UIDefaults.LazyValue) t -> new BooleanRenderer());
}

Другие вопросы по теме