JAVA 9 不可变列表的工厂方法,java工厂
JAVA 9 不可变列表的工厂方法,java工厂
简介
Oracle Corporation将于2017年3月左右发布Java新版本:Java SE 9。因此,我想提供一系列有关Java SE 9新功能的帖子。这是我在这个系列中的第四篇文章。
我已经在Java SE 9新功能上发布了几个帖子。在阅读这些帖子之前,请阅读以下内容:
- Java SE 9 REPL
- Java SE 9:Interface中的私有方法
- Java SE 9:局部变量的”var”
在这篇文章中,我们将讨论另一个Java SE 9新功能:“不可变列表的工厂方法”,其中包含一些简单而合适的示例。
Java SE 8:空的不可变列表
在Java SE 8及更早版本中,如果我们要创建一个空的Immutable
或Unmodifiable 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
相关文章
- 暂无相关文章
用户点评