1. Обзор
ClassToInstanceMap <B>
— это карта особого типа, которая связывает классы с соответствующими экземплярами. Он гарантирует, что все ключи и значения являются подтипами верхней границы типа B.
ClassToInstanceMap
расширяет интерфейс карты
Java и предоставляет два дополнительных метода: T getInstance(Class<T>)
и T putInstance(Class<T>, T).
Преимущество этой карты в том, что эти два метода можно использовать для выполнения операций с типобезопасностью и предотвращения приведения.
В этом руководстве мы покажем, как использовать интерфейс ClassToInstanceMap
Google Guava и его реализации.
2. Карта ClassToInstanceMap от Google Guava
Давайте посмотрим, как использовать реализацию.
Мы начнем с добавления зависимости библиотеки Google Guava в pom.xml
:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version>
</dependency>
Последнюю версию зависимости можно проверить здесь .
Интерфейс ClassToInstanceMap
имеет две реализации: изменяемую и неизменяемую. Давайте рассмотрим каждый из них в отдельности.
3. Создание ImmutableClassToInstanceMap
Мы можем создать экземпляр ImmutableClassToInstanceMap
несколькими способами:
- используя метод
of()
для создания пустой карты:
ImmutableClassToInstanceMap.of()
- используя метод
of(Class<T> type, T value)
для создания карты с одной записью:
ImmutableClassToInstanceMap.of(Save.class, new Save());
- используя
метод copyOf()
, который принимает другую карту в качестве параметра. Он создаст карту с теми же записями, что и карта, указанная в качестве параметра:
ImmutableClassToInstanceMap.copyOf(someMap)
- с помощью конструктора:
ImmutableClassToInstanceMap.<Action>builder()
.put(Save.class, new Save())
.put(Open.class, new Open())
.put(Delete.class, new Delete())
.build();
4. Создание MutableClassToInstanceMap
Мы также можем создать экземпляр MutableClassToInstanceMap
:
- используя метод
create()
, который создает экземпляр, поддерживаемыйHashMap
:
MutableClassToInstanceMap.create();
- используя
create(Map<Class<? extends B>, B> backingMap)
, который создает экземпляр, поддерживаемый предоставленной пустой картой:
MutableClassToInstanceMap.create(new HashMap());
5. Использование
Давайте посмотрим, как использовать два новых метода, добавленных в обычный интерфейс Map :
- первый метод:
<T extends B> T getInstance (тип Class<T>)
:
Action openAction = map.get(Open.class);
Delete deleteAction = map.getInstance(Delete.class);
- второй метод:
<T extends B> T putInstance (тип Class<T>, значение @Nullable T)
:
Action newOpen = map.put(Open.class, new Open());
Delete newDelete = map.putInstance(Delete.class, new Delete());
6. Заключение
В этом кратком руководстве мы показали примеры использования ClassToInstanceMap
из библиотеки Guava.
Реализацию этих примеров можно найти в этих примерах можно найти в проекте GitHub .