# Java 9 不可变集示例

> 原文： [https://javatutorial.net/java-9-immutable-set-example](https://javatutorial.net/java-9-immutable-set-example)

本示例演示了如何使用新的 Java 9 `Collection`工厂方法创建不可变的`Set`。

在 Java 9 发行版中，Oracle 从其他流行的 [JVM](https://javatutorial.net/jvm-explained) 语言（例如 Kotlin，Guava，Scala 等）获取工作实践方面迈出了第一步。做到这一点时要适当考虑到跨语言的向后兼容性和语法一致性。 [JDK](https://javatutorial.net/install-java-8-jdk-on-ubuntu) 。 那些 [Java 9](https://javatutorial.net/install-java-9-eclipse) 新功能之一是**不变（不可修改）集**的创建。

![Java 9 immutable Set example](img/4d2542ece1b5678915e99fa4d01bad0f.jpg)

Java 9 不可变集示例

在 Java 9 之前，创建不可变`Set`是某种冗长的任务。 例如，要使用 Java 9 之前的版本创建一个空的不可变`Set`，我们使用以下代码：

```java
package javatutorial.net;

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

public class UnmodifiableSetExample {

	public static void main(String[] args) {
		Set<String> emptySet = new HashSet<String>();
		Set<String> immutableSet = Collections.unmodifiableSet(emptySet);
	}

}
```

## 什么是不可变集

一旦在 Java 中创建了不可变对象，就无法更改值。 不可变集也不例外。 您**不能**：

*   从集合中添加或删除条目。 如果您尝试这样做，将在`java.lang.UnsupportedOperationException`中解决
*   修改`Set`元素。 尝试这样做会导致`java.lang.UnsupportedOperationException`
*   将空元素添加到集合中。 如果您尝试向集合中添加一个`null`元素，则结果为`java.lang.NullPointerException`

## 在 Java 9 中创建空的不可变集

要在 Java 9 中创建一个空列表，我们需要做的就是调用`List`工厂方法`of()`，请参见下面的示例

```java
package javatutorial.net;

import java.util.Set;

public class Java9EmptyImmutableSetExample {
	public static void main(String[] args) {
		Set<String> emptySet = Set.of();
	}
}
```

## 在 Java 9 中使用元素创建不可变集

有 10 种工厂方法可创建不可变的`Set`，最多可包含 10 个元素（来源： [Java 9 `Set`接口 Javadoc](https://docs.oracle.com/javase/9/docs/api/java/util/Set.html) ）：

```java
static <E> Set<E>	of​(E e1)	
Returns an immutable set containing one element.

static <E> Set<E>	of​(E e1, E e2)	
Returns an immutable set containing two elements.

static <E> Set<E>	of​(E e1, E e2, E e3)	
Returns an immutable set containing three elements.

static <E> Set<E>	of​(E e1, E e2, E e3, E e4)	
Returns an immutable set containing four elements.

static <E> Set<E>	of​(E e1, E e2, E e3, E e4, E e5)	
Returns an immutable set containing five elements.

static <E> Set<E>	of​(E e1, E e2, E e3, E e4, E e5, E e6)	
Returns an immutable set containing six elements.

static <E> Set<E>	of​(E e1, E e2, E e3, E e4, E e5, E e6, E e7)	
Returns an immutable set containing seven elements.

static <E> Set<E>	of​(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8)	
Returns an immutable set containing eight elements.

static <E> Set<E>	of​(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9)	
Returns an immutable set containing nine elements.

static <E> Set<E>	of​(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9, E e10)	
Returns an immutable set containing ten elements.
```

以及一种具有可变数量参数的方法，可让您创建具有任意数量元素的不可变集：

```java
static <E> Set<E>	of​(E... elements)
```

下面的示例创建了一个由 3 个元素组成的不可变的`Set`：

```java
package javatutorial.net;

import java.util.Set;

public class Java9ImmutableSetExample {
	public static void main(String[] args) {
		Set set = Set.of("A", "B", "C");
	}
}
```

您将在此处找到的许多教程都是基于 Edward Lavieri 博士和 Peter Verhas 博士撰写的 [Mastering Java 9](https://www.amazon.com/Mastering-Java-reactive-modular-concurrent/dp/1786468735/ref=sr_1_3?ie=UTF8&qid=1520921208&sr=8-3&keywords=mastering+java+9) 。 本书将为您提供对 Java 9 新概念和工具的完整而深刻的理解。