原文: https://beginnersbook.com/2018/04/java-9-factory-methods-to-create-immutable-set/

在上一个教程中,我们学习了如何使用 Java 9 中引入的工厂方法轻松创建不可变List。在本指南中,我们将看到使用新引入的工厂方法来创建不可变Set

1.在 Java 9 之前创建不可变Set

在我们讨论如何使用工厂方法创建不可修改的Set之前,让我们看看我们如何在 Java 9 之前创建不可变Set

1.1 在 java SE 9 之前创建空的不可变Set

在 Java 9 之前,我们必须使用Collections类的unmodifiableSet()方法来创建不可变的Set。在以下示例中,我们将创建一个空集。

  1. Set<String> emptyHashSet = new HashSet<String>();
  2. Set<String> immutableHSet = Collections.unmodifiableSet(emptyHashSet);

让我们在 JShell (Java 9 中引入的新工具)中测试此代码

Java 9 - 创建不可变`Set`的工厂方法 - 图1

1.2 在 Java SE 9 之前创建非空的不可变Set

这就是我们在 Java 9 之前用来创建非空的不可变Set的方法。正如您所看到的,我们必须编写几行代码来实现这一点。在 Java 9 中,我们可以在一行中编写此代码,我们将在下一节中看到。

  1. Set<String> hset = new HashSet<String>();
  2. hset.add("Jon Snow");
  3. hset.add("Khal Drogo");
  4. hset.add("Daenerys");
  5. Set<String> immutableSet = Collections.unmodifiableSet(hset);

Java 9 - 创建不可变`Set`的工厂方法 - 图2

2. Java 9 - 使用Set的静态工厂方法创建不可变Set

Java 9 引入了几个版本的of()方法来创建不可修改的集合。

  1. static <E> Set<E> of()

2.1 Java 9 - 创建空的不可变Set

  1. Set<String> immutableSet = Set.of();

Java 9 - 创建不可变`Set`的工厂方法 - 图3

2.2 Java 9 - 创建非空的不可变Set

正如您所看到的,在 Java 9 中创建不可变Set是多么简单。

  1. Set<String> immutableSet = Set.of("Apple", "Banana", "Orange");

Java 9 - 创建不可变`Set`的工厂方法 - 图4

3.什么是不可变Set

  1. 不可变Set不允许添加,删除和更新其元素,如果我们尝试这样做,那么我们将得到UnsupportedOperationException异常。让我们举个例子来看看这个。
  1. jshell> Set immutableSet = Set.of("Paul", "Lora", "Steve");
  2. immutableSet ==> [Paul, Lora, Steve]
  3. jshell> immutableSet.add("Harry")
  4. | java.lang.UnsupportedOperationException thrown:
  5. | at ImmutableCollections.uoe (ImmutableCollections.java:71)
  6. | at ImmutableCollections$AbstractImmutableSet.add (ImmutableCollections.java:281)
  7. | at (#2:1)
  1. 我们不能将null元素添加到不可变Set
  1. jshell> Set immutableSet = Set.of("Paul", "Lora", "Steve");
  2. immutableSet ==> [Lora, Steve, Paul]
  3. jshell> immutableSet.add(null)
  4. | java.lang.UnsupportedOperationException thrown:
  5. | at ImmutableCollections.uoe (ImmutableCollections.java:71)
  6. | at ImmutableCollections$AbstractImmutableSet.add (ImmutableCollections.java:281)
  7. | at (#2:1)