Java SE 9:不可变列表的工厂方法

时间:2020-02-23 14:37:02  来源:igfitidea点击:

在本文中,我们将讨论一些Java SE 9新功能:"不可变列表的工厂方法",并提供一些简单而合适的示例。

Java SE 8:空的不可变列表

在Java SE 8和更早版本中,如果我们要创建一个空的不可变或者不可修改列表,则应使用Collections类实用程序方法:unmodifiableList,如下所示:

例:

List<String> emptyList = new ArrayList<>();
 List<String> immutableList = Collections.unmodifiableList(emptyList);

注意:-Diamond Operator在Java SE 6和早期版本中不起作用。
所有Java版本的其余代码都是相同的。

在Java SE 9 REPL中测试以上代码:

其中我们可以观察到要创建一个空的不可变列表,我们需要做很多事情,如上所示。
这是非常繁琐和冗长的事情。
现在让我们在Java SE 9中看到同样的事情。

注意:-为了简便和快速测试,我使用Java SE 9 REPL(JShell)。
这就是为什么我们需要每种语言都使用REPL来快速测试新功能而无需做很多工作的原因。

Java SE 9:空的不可变列表

为了克服这些缺点,Java SE 9在List接口中引入了两个有用的方法,因此我们不需要使用所有这些繁琐的步骤来创建不可变的空列表。

如果通过Java SE 9 List API,我们可以在List接口中找到以下方法签名。

static <E> List<E> of()

它用于创建一个空的不可变列表(具有零个元素的列表)。

例:

List<String> immutableList = List.of();

在Java SE 9 REPL中测试以上代码:

在这里我们可以看到,在Java SE 9中创建一个空的不可变列表非常容易。

Java SE 8:非空不可变列表

现在,我们将看到如何在Java SE 8和更早版本中创建非空不可变列表。

例:

List<String> list = new ArrayList<>();
 list.add("one");
 list.add("two");
 list.add("three");
 List<String> immutableList = Collections.unmodifiableList(list);

在这里我们还可以观察到,要创建一个非空的不可变列表,我们需要做很多事情以及非常繁琐和冗长的步骤。
现在让我们在Java SE 9中看到同样的事情。

Java SE 9:非空不可变列表

为了克服这些缺点,Java SE 9引入了以下有用的重载方法。

这些有用的方法用于创建一个新的不可变列表,其中包含一个元素到10个元素:

static <E> List<E> of(E e1)
static <E> List<E> of(E e1,E e2)	
static <E> List<E> of(E e1,E e2,E e3)
static <E> List<E> of(E e1,E e2,E e3,E e4)
static <E> List<E> of(E e1,E e2,E e3,E e4,E e5)	
static <E> List<E> of(E e1,E e2,E e3,E e4,E e5,E e6)	
static <E> List<E> of(E e1,E e2,E e3,E e4,E e5,E e6,E e7)	
static <E> List<E> of(E e1,E e2,E e3,E e4,E e5,E e6,E e7,E e8)	
static <E> List<E> of(E e1,E e2,E e3,E e4,E e5,E e6,E e7,E e8,E e9)	
static <E> List<E> of(E e1,E e2,E e3,E e4,E e5,E e6,E e7,E e8,E e9,E e10)

以下是Var-Args方法(可变参数数目方法):

static <E> List<E> of(E... elements)

例:

List<String> immutableList = List.of("one","two","three");

此代码非常简单,没有冗长。
好东西!

在Java SE 9 REPL中测试以上代码:

jshell> List<String> immutableList = List.of("one","two","three")
immutableList ==> [one, two, three]

不可变表的特征

众所周知,不可变列表是不可修改的(不可修改的集合)。
在本节中,我们将讨论不可变列表的特征(它们在所有Java版本中都是相同的):

  • 它们是不可变的。

  • 我们无法添加,修改和删除它们的元素。

  • 如果尝试对它们执行添加/删除/更新操作,则会得到UnsupportedOperationException,如下所示:

jshell> immutableList.add("four")
|  java.lang.UnsupportedOperationException thrown: 
|        at ImmutableCollections.uoe (ImmutableCollections.java:68)
|        at ImmutableCollections$AbstractImmutableList.add (ImmutableCollections.java:74)
|        at (#2:1)
  • 它们不允许使用null元素。

  • 如果尝试使用null元素创建它们,则会得到NullPointerException,如下所示:

jshell> List>String> immutableList = List.of("one","two","three", null)
|  java.lang.NullPointerException thrown: 
|        at Objects.requireNonNull (Objects.java:221)
|        at ImmutableCollections$ListN. (ImmutableCollections.java:179)
|        at List.of (List.java:859)
|        at (#4:1)
  • 如果尝试添加null元素,则会得到UnsupportedOperationException,如下所示:
jshell> immutableList.add(null)
|  java.lang.UnsupportedOperationException thrown: 
|        at ImmutableCollections.uoe (ImmutableCollections.java:68)
|        at ImmutableCollections$AbstractImmutableList.add (ImmutableCollections.java:74)
|        at (#3:1)
  • 如果所有元素都是可序列化的,则它们是可序列化的。