JAVA 9 不可变列表的工厂方法

简介

Oracle Corporation将于2017年3月左右发布Java新版本:Java SE 9。因此,我想提供一系列有关Java SE 9新功能的帖子。这是我在这个系列中的第四篇文章。

我已经在Java SE 9新功能上发布了几个帖子。在阅读这些帖子之前,请阅读以下内容:

在这篇文章中,我们将讨论另一个Java SE 9新功能:“不可变列表的工厂方法”,其中包含一些简单而合适的示例。

Java SE 8:空的不可变列表

在Java SE 8及更早版本中,如果我们要创建一个空的ImmutableUnmodifiable List,我们应该使用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方法(Variable Number of arguments method):

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版本中都是相同的。):

  • 他们是不可变(Immutable)的。
  • 我们无法添加(add),修改(modify)和删除(delete)它们的元素。
  • 如果我们尝试对它们执行 添加/删除/更新 操作,我们将得到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)
  • 如果所有元素都可序列化(serializable),则它们是可序列化的。

这就是“Java SE 9:不可变列表的工厂方法”概念。我们将在以后的帖子中讨论更多Java SE 9新功能。


翻译自:Java SE 9: Factory Methods for Immutable List written by Rambabu Posa

猜你喜欢

转载自blog.csdn.net/why_still_confused/article/details/82254539