โดยทั่วไปunModifiable
คอลเล็กชันคือมุมมองดังนั้นทางอ้อมอาจยังสามารถ 'แก้ไข' จากการอ้างอิงอื่นที่สามารถแก้ไขได้ นอกจากนี้ยังเป็นเพียงมุมมองแบบอ่านอย่างเดียวของคอลเล็กชั่นอื่น ๆ เมื่อคอลเลกชันต้นฉบับเปลี่ยนคอลเลกชันที่ไม่สามารถเปลี่ยนแปลงได้จะแสดงด้วยค่าล่าสุดเสมอ
อย่างไรก็ตามimmutable
คอลเลกชันสามารถถือเป็นสำเนาแบบอ่านอย่างเดียวของคอลเล็กชันอื่นและไม่สามารถแก้ไขได้ ในกรณีนี้เมื่อคอลเลกชันของแหล่งที่มามีการเปลี่ยนแปลงคอลเลกชันที่ไม่เปลี่ยนรูปจะไม่สะท้อนการเปลี่ยนแปลง
นี่คือบททดสอบเพื่อให้เห็นความแตกต่างนี้
@Test
public void testList() {
List<String> modifiableList = new ArrayList<String>();
modifiableList.add("a");
System.out.println("modifiableList:"+modifiableList);
System.out.println("--");
//unModifiableList
assertEquals(1, modifiableList.size());
List<String> unModifiableList=Collections.unmodifiableList(
modifiableList);
modifiableList.add("b");
boolean exceptionThrown=false;
try {
unModifiableList.add("b");
fail("add supported for unModifiableList!!");
} catch (UnsupportedOperationException e) {
exceptionThrown=true;
System.out.println("unModifiableList.add() not supported");
}
assertTrue(exceptionThrown);
System.out.println("modifiableList:"+modifiableList);
System.out.println("unModifiableList:"+unModifiableList);
assertEquals(2, modifiableList.size());
assertEquals(2, unModifiableList.size());
System.out.println("--");
//immutableList
List<String> immutableList=Collections.unmodifiableList(
new ArrayList<String>(modifiableList));
modifiableList.add("c");
exceptionThrown=false;
try {
immutableList.add("c");
fail("add supported for immutableList!!");
} catch (UnsupportedOperationException e) {
exceptionThrown=true;
System.out.println("immutableList.add() not supported");
}
assertTrue(exceptionThrown);
System.out.println("modifiableList:"+modifiableList);
System.out.println("unModifiableList:"+unModifiableList);
System.out.println("immutableList:"+immutableList);
System.out.println("--");
assertEquals(3, modifiableList.size());
assertEquals(3, unModifiableList.size());
assertEquals(2, immutableList.size());
}
เอาท์พุต
modifiableList:[a]
--
unModifiableList.add() not supported
modifiableList:[a, b]
unModifiableList:[a, b]
--
immutableList.add() not supported
modifiableList:[a, b, c]
unModifiableList:[a, b, c]
immutableList:[a, b]
--