Contents

Guava Classtoinstancemap简介

1. 概述

ClassToInstanceMap<B>是一种特殊类型的映射,它将类与相应的实例相关联。它确保所有键和值都是上限类型B的子类型。

ClassToInstanceMap扩展了 Java 的Map接口并提供了两个附加方法:T getInstance(Class<T>)T putInstance(Class<T>, T)。此映射的优点是这两种方法可用于执行类型安全操作并避免强制转换。

在本教程中,我们将展示如何使用 Google Guava 的ClassToInstanceMap接口及其实现。

2. Google Guava 的ClassToInstanceMap

让我们看一下如何使用该实现。

我们将首先在pom.xml中添加 Google Guava 库依赖项:

<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的实例:

  • 使用创建由HashMap支持的实例的*create()*方法:
MutableClassToInstanceMap.create();
  • 使用create(Map<Class<? extends B>, B*> backingMap)*使实例由提供的空映射支持:
MutableClassToInstanceMap.create(new HashMap());

5. 用法

让我们看看如何使用添加到常规Map接口的两个新方法:

  • 第一种方法是*<T extends B> T getInstance(Class<T> type)*:
Action openAction = map.get(Open.class);
Delete deleteAction = map.getInstance(Delete.class);
  • 第二种方法是*<T extends B> T putInstance(Class<T> type, @Nullable T value)*:
Action newOpen = map.put(Open.class, new Open());
Delete newDelete = map.putInstance(Delete.class, new Delete());