Java中的不可改变的ArrayList
评论 0
浏览 0
2013-12-24
1.概述
这个快速教程将展示如何用核心JDK、Guava和最后用Apache Commons Collections 4 使ArrayList不可变。
这篇文章是the “Java –Back to Basic”系列的一部分这里是Baeldung。
进一步的阅读。
2.使用JDK
首先,JDK提供了一个很好的方法,可以从现有的集合中得到一个不可修改的集合。
Collections.unmodifiableList(list);
这时,新的集合不应该再被修改了。
@Test(expected = UnsupportedOperationException.class)
public void givenUsingTheJdk_whenUnmodifiableListIsCreated_thenNotModifiable() {
List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
List<String> unmodifiableList = Collections.unmodifiableList(list);
unmodifiableList.add("four");
}
2.1.使用Java 9
从Java 9开始,我们可以使用List<E>.of(E…elements)静态工厂方法来创建一个不可变的列表。
@Test(expected = UnsupportedOperationException.class)
public final void givenUsingTheJava9_whenUnmodifiableListIsCreated_thenNotModifiable() {
final List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
final List<String> unmodifiableList = List.of(list.toArray(new String[]{}));
unmodifiableList.add("four");
}
请注意,我们必须将现有的list转换成数组。这是因为List.of(元素)接受可变参数。
3.使用 Guava
Guava提供了类似的功能来创建它自己的ImmutableList版本。
ImmutableList.copyOf(list);
同样地 – 所产生的列表不应该是可修改的。
@Test(expected = UnsupportedOperationException.class)
public void givenUsingGuava_whenUnmodifiableListIsCreated_thenNotModifiable() {
List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
List<String> unmodifiableList = ImmutableList.copyOf(list);
unmodifiableList.add("four");
}
请注意,这个操作实际上将创建一个原始列表的副本,而不仅仅是一个视图。
Guava还提供了一个构建器 – 这将会返回强类型的ImmutableList,而不是简单的List。
@Test(expected = UnsupportedOperationException.class)
public void givenUsingGuavaBuilder_whenUnmodifiableListIsCreated_thenNoLongerModifiable() {
List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
ImmutableList<String> unmodifiableList = ImmutableList.<String>builder().addAll(list).build();
unmodifiableList.add("four");
}
4.使用Apache Collections Commons
最后,Commons Collection还提供了一个API,用于创建一个不可修改的列表。
ListUtils.unmodifiableList(list);
再说一遍,修改所产生的列表应该导致不支持操作的异常。
@Test(expected = UnsupportedOperationException.class)
public void givenUsingCommonsCollections_whenUnmodifiableListIsCreated_thenNotModifiable() {
List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
List<String> unmodifiableList = ListUtils.unmodifiableList(list);
unmodifiableList.add("four");
}
5.总结
本教程说明了如何使用核心JDK、Google Guava或Apache Commons Collections轻松从现有的ArrayList中创建一个不可修改的List。
所有这些例子和代码片段的实现可以在Github上找到--这是一个基于Maven的项目,所以应该很容易导入和运行,就像现在一样。
0 个评论