Java Immutable List - Java 147

Java Immutable List – Java 147

Java 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 來建立不可變的集合,提供了範例參考。

發佈留言