Java SE 9:不可变集的工厂方法
在本文中,我们将讨论一些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]
其中我们创建了带有字符串元素数组的不可变集。
注意:-不可变集的特征类似于不可变列表。