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

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

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

Java SE 8:不可变的空集

在Java SE 8和更早版本中,如果我们要创建一个空的Immutable或者Unmodifiable Set,则应使用Collections类实用程序方法:unmodifiableSet,如下所示:

空集示例:

Set<String> emptySet = new HashSet<>();
 Set<String> immutableSet = Collections.unmodifiableSet(emptySet);

其中我们可以看到这是一个非常繁琐且冗长的过程。
现在让我们在Java SE 9中看到同样的事情。

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

Java SE 9:不可变的空集

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

如果通过Java SE 9 Set API,我们可以在Set接口中找到以下方法签名。
空集API实用程序

static <E> Set<E> of()

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

空集示例:

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

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

Java SE 8:不可变的非空集

在本节中,我们将看到如何在Java SE 8和更早版本中创建不可变的非空集。
我们使用Collections类中相同的unmodifiableable方法创建一个不可变的非空集,如下所示:

非空集示例:

Set<String> nonemptySet = new HashSet<>();
 nonemptySet.add("one");
 nonemptySet.add("two");
 nonemptySet.add("three");
 Set<String> immutableSet = Collections.unmodifiableSet(nonemptySet);

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

其中我们可以看到这是一个非常繁琐且冗长的过程。
现在让我们在Java SE 9中看到同样的事情。

Java SE 9:不可变的非空集

在本节中,我们将看到如何在Java SE 9版本中创建不可变的非空集。
如果我们通过Java SE 9 Set Interface API,我们将看到一组重载方法,如下所示:

非空集API实用程序

static <E> Set<E> of(E e1)
static <E> Set<E> of(E e1,E e2)	
static <E> Set<E> of(E e1,E e2,E e3)
static <E> Set<E> of(E e1,E e2,E e3,E e4)
static <E> Set<E> of(E e1,E e2,E e3,E e4,E e5)	
static <E> Set<E> of(E e1,E e2,E e3,E e4,E e5,E e6)	
static <E> Set<E> of(E e1,E e2,E e3,E e4,E e5,E e6,E e7)	
static <E> Set<E> of(E e1,E e2,E e3,E e4,E e5,E e6,E e7,E e8)	
static <E> Set<E> of(E e1,E e2,E e3,E e4,E e5,E e6,E e7,E e8,E e9)	
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)

非空集示例:

Set<String> immutableSet = Set.of("one","two","three");

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

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

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

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

Java SE 9:具有Var-Args的不可变非空集

Oracle Corp引入了另一种使用Var-args语法的Set.of()方法。
以下是用于在Java SE 9中创建非空不可变集的Var-Args方法(可变参数数目方法):

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

它用于创建带有元素数组的不可变集,如下所示:

非空集示例:

String[] nameArr =  { "one", "two", "three"};
 Set<String[]> set= Set.<String[]>of(nameArr);

使用Java SE 9 REPL对此进行测试:

jshell> String[] nameArr =  { "one", "two", "three"}
nameArr ==> String[3] { "one", "two", "three" }

jshell> Set<String[]> set = Set.<String[]>of(nameArr);
set ==> [[Ljava.lang.String;@56ef9176]

jshell> set
set ==> [[Ljava.lang.String;@56ef9176]

其中我们创建了带有字符串元素数组的不可变集。

注意:-不可变集的特征类似于不可变列表。