Table of Contents
ToggleJava Immutable List
是一種不可變的 List 類別,集合建立後,元素是固定的或不變的,也就是說集合是唯讀的,如果操作新增、刪除和更新集合中的元素,則會拋出 UnsupportedOperationException 的例外,同時也不允許 null 元素, 如果試圖建立具有 null 元素的 ImmutableList,則會拋出 NullPointerException 的例外, Immutable Java List 本篇增加了範例,並透過單元測試來驗證產出結果。
檔案目錄
./
+- src
+- test
| +- org
| +- ruoxue
| +- java_147
| +- list
| +- ImmutableListTest.java
單元測試
Immutable List Java 提供建立不可變的的集合。
Arrays_asList
建立一個 List ,使用 Arrats asList 初始化三個元素,為不可變的集合,若操作新增、刪除等方法,會拋出例外。
@Test
public void Arrays_asList() {
List<String> list = Arrays.asList("Apple", "Banana", "Cherry");
assertThatCode(() -> list.add("Kiwifruit")).isInstanceOf(UnsupportedOperationException.class);
System.out.println(list);
assertThat(list).hasSize(3);
List<Integer> intList = Arrays.asList(Integer.MAX_VALUE, -1, 3);
assertThatCode(() -> intList.add(101)).isInstanceOf(UnsupportedOperationException.class);
System.out.println(intList);
assertThat(intList).hasSize(3);
}
[Apple, Banana, Cherry]
[2147483647, -1, 3]
Collections_unmodifiableList
Immutable List Java 建立一個 List ,使用 Collections unmodifiableList 初始化三個元素,為不可變的集合,若操作新增、刪除等方法,會拋出例外。
@Test
public void Collections_unmodifiableList() {
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
List<String> result = Collections.unmodifiableList(list);
assertThatCode(() -> result.add("Kiwifruit")).isInstanceOf(UnsupportedOperationException.class);
System.out.println(result);
assertThat(result).hasSize(3);
List<Integer> intList = new ArrayList<>();
intList.add(Integer.MAX_VALUE);
intList.add(-1);
intList.add(3);
List<Integer> intResult = Collections.unmodifiableList(intList);
assertThatCode(() -> intResult.add(101)).isInstanceOf(UnsupportedOperationException.class);
System.out.println(intResult);
assertThat(result).hasSize(3);
}
[Apple, Banana, Cherry]
[2147483647, -1, 3]
Collections_singletonList
Immutable List Java 建立一個 List ,使用 Collections singletonList 初始化一個元素,只能包含一個元素,為不可變的集合,若操作新增、刪除等方法,會拋出例外。
@Test
public void Collections_singletonList() {
List<String> result = Collections.singletonList("Apple");
assertThatCode(() -> result.add("Banana")).isInstanceOf(UnsupportedOperationException.class);
System.out.println(result);
assertThat(result).hasSize(1);
List<Integer> intResult = Collections.singletonList(Integer.MAX_VALUE);
assertThatCode(() -> intResult.add(-3)).isInstanceOf(UnsupportedOperationException.class);
System.out.println(intResult);
assertThat(result).hasSize(1);
}
[Apple]
[2147483647]
ImmutableList_of
Immutable List Java 建立一個 List ,使用 Guava ImmutableList of 初始化三個元素,為不可變的集合,若操作新增、刪除等方法,會拋出例外。
@Test
public void ImmutableList_of() {
List<String> list = ImmutableList.of("Apple", "Banana", "Cherry");
assertThatCode(() -> list.add("Kiwifruit")).isInstanceOf(UnsupportedOperationException.class);
System.out.println(list);
assertThat(list).hasSize(3);
List<Integer> intList = ImmutableList.of(Integer.MAX_VALUE, -1, 3);
assertThatCode(() -> intList.add(101)).isInstanceOf(UnsupportedOperationException.class);
System.out.println(intList);
assertThat(intList).hasSize(3);
}
[Apple, Banana, Cherry]
[2147483647, -1, 3]
ImmutableList_copyOf
Immutable List Java 建立一個 List ,使用 Guava ImmutableList copyOf 初始化三個元素,為不可變的集合,若操作新增、刪除等方法,會拋出例外。
@Test
public void ImmutableList_copyOf() {
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
List<String> result = ImmutableList.copyOf(list);
assertThatCode(() -> result.add("Kiwifruit")).isInstanceOf(UnsupportedOperationException.class);
System.out.println(result);
assertThat(result).hasSize(3);
List<Integer> intList = new ArrayList<>();
intList.add(Integer.MAX_VALUE);
intList.add(-1);
intList.add(3);
List<Integer> intResult = ImmutableList.copyOf(intList);
assertThatCode(() -> intResult.add(101)).isInstanceOf(UnsupportedOperationException.class);
System.out.println(intResult);
assertThat(result).hasSize(3);
}
[Apple, Banana, Cherry]
[2147483647, -1, 3]
ImmutableList_builder
Java List Immutable 建立一個 List ,使用 Guava ImmutableList builder 初始化三個元素,為不可變的集合,若操作新增、刪除等方法,會拋出例外。
@Test
public void ImmutableList_builder() {
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
List<String> result = ImmutableList.<String>builder().addAll(list).build();
assertThatCode(() -> result.add("Kiwifruit")).isInstanceOf(UnsupportedOperationException.class);
System.out.println(result);
assertThat(result).hasSize(3);
List<Integer> intList = new ArrayList<>();
intList.add(Integer.MAX_VALUE);
intList.add(-1);
intList.add(3);
List<Integer> intResult = ImmutableList.<Integer>builder().addAll(intList).build();
assertThatCode(() -> intResult.add(101)).isInstanceOf(UnsupportedOperationException.class);
System.out.println(intResult);
assertThat(result).hasSize(3);
}
[Apple, Banana, Cherry]
[2147483647, -1, 3]
ListUtils_unmodifiableList
Java List Immutable 建立一個 List ,使用 Apache Collections4 套件中的 ListUtils unmodifiableList 初始化三個元素,為不可變的集合,若操作新增、刪除等方法,會拋出例外。
@Test
public void ListUtils_unmodifiableList() {
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
List<String> result = ListUtils.unmodifiableList(list);
assertThatCode(() -> result.add("Kiwifruit")).isInstanceOf(UnsupportedOperationException.class);
System.out.println(result);
assertThat(result).hasSize(3);
List<Integer> intList = new ArrayList<>();
intList.add(Integer.MAX_VALUE);
intList.add(-1);
intList.add(3);
List<Integer> intResult = ListUtils.unmodifiableList(intList);
assertThatCode(() -> intResult.add(101)).isInstanceOf(UnsupportedOperationException.class);
System.out.println(intResult);
assertThat(result).hasSize(3);
}
[Apple, Banana, Cherry]
[2147483647, -1, 3]
ImmutableListTest.java
Java List Immutable 新增單元測試,驗證是否符合預期。
package org.ruoxue.java_147.list;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatCode;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.apache.commons.collections4.ListUtils;
import org.junit.Test;
import com.google.common.collect.ImmutableList;
public class ImmutableListTest {
@Test
public void Arrays_asList() {
List<String> list = Arrays.asList("Apple", "Banana", "Cherry");
assertThatCode(() -> list.add("Kiwifruit")).isInstanceOf(UnsupportedOperationException.class);
System.out.println(list);
assertThat(list).hasSize(3);
List<Integer> intList = Arrays.asList(Integer.MAX_VALUE, -1, 3);
assertThatCode(() -> intList.add(101)).isInstanceOf(UnsupportedOperationException.class);
System.out.println(intList);
assertThat(intList).hasSize(3);
}
@Test
public void Collections_unmodifiableList() {
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
List<String> result = Collections.unmodifiableList(list);
assertThatCode(() -> result.add("Kiwifruit")).isInstanceOf(UnsupportedOperationException.class);
System.out.println(result);
assertThat(result).hasSize(3);
List<Integer> intList = new ArrayList<>();
intList.add(Integer.MAX_VALUE);
intList.add(-1);
intList.add(3);
List<Integer> intResult = Collections.unmodifiableList(intList);
assertThatCode(() -> intResult.add(101)).isInstanceOf(UnsupportedOperationException.class);
System.out.println(intResult);
assertThat(result).hasSize(3);
}
@Test
public void ImmutableList_of() {
List<String> list = ImmutableList.of("Apple", "Banana", "Cherry");
assertThatCode(() -> list.add("Kiwifruit")).isInstanceOf(UnsupportedOperationException.class);
System.out.println(list);
assertThat(list).hasSize(3);
List<Integer> intList = ImmutableList.of(Integer.MAX_VALUE, -1, 3);
assertThatCode(() -> intList.add(101)).isInstanceOf(UnsupportedOperationException.class);
System.out.println(intList);
assertThat(intList).hasSize(3);
}
@Test
public void ImmutableList_copyOf() {
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
List<String> result = ImmutableList.copyOf(list);
assertThatCode(() -> result.add("Kiwifruit")).isInstanceOf(UnsupportedOperationException.class);
System.out.println(result);
assertThat(result).hasSize(3);
List<Integer> intList = new ArrayList<>();
intList.add(Integer.MAX_VALUE);
intList.add(-1);
intList.add(3);
List<Integer> intResult = ImmutableList.copyOf(intList);
assertThatCode(() -> intResult.add(101)).isInstanceOf(UnsupportedOperationException.class);
System.out.println(intResult);
assertThat(result).hasSize(3);
}
@Test
public void ImmutableList_builder() {
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
List<String> result = ImmutableList.<String>builder().addAll(list).build();
assertThatCode(() -> result.add("Kiwifruit")).isInstanceOf(UnsupportedOperationException.class);
System.out.println(result);
assertThat(result).hasSize(3);
List<Integer> intList = new ArrayList<>();
intList.add(Integer.MAX_VALUE);
intList.add(-1);
intList.add(3);
List<Integer> intResult = ImmutableList.<Integer>builder().addAll(intList).build();
assertThatCode(() -> intResult.add(101)).isInstanceOf(UnsupportedOperationException.class);
System.out.println(intResult);
assertThat(result).hasSize(3);
}
@Test
public void ListUtils_unmodifiableList() {
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
List<String> result = ListUtils.unmodifiableList(list);
assertThatCode(() -> result.add("Kiwifruit")).isInstanceOf(UnsupportedOperationException.class);
System.out.println(result);
assertThat(result).hasSize(3);
List<Integer> intList = new ArrayList<>();
intList.add(Integer.MAX_VALUE);
intList.add(-1);
intList.add(3);
List<Integer> intResult = ListUtils.unmodifiableList(intList);
assertThatCode(() -> intResult.add(101)).isInstanceOf(UnsupportedOperationException.class);
System.out.println(intResult);
assertThat(result).hasSize(3);
}
}
心得分享
List Immutable in Java 無法在不可修改的 List 中新增或刪除新元素,但可以使用物件參考修改儲存在其中的元素,Java List Immutable 使用 JDK、Guava 以及 Apache Collections 4 來建立不可變的集合,提供了範例參考。