ใช้ Collections.unmodifiableList() ห่อหุ้ม ArrayList ให้กลายเป็น Unmodifiable View หากพยายามแก้ไขจะโยน UnsupportedOperationException
ตัวอย่างโค้ด
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ArrayListReadOnly {
public static void main(String[] args) {
// สร้าง ArrayList ปกติ
ArrayList<String> list = new ArrayList<>();
list.add("JavaFx");
list.add("Java");
list.add("WebGL");
list.add("OpenCV");
System.out.println("Original: " + list);
// ทำให้ Read-Only
List<String> readOnlyList = Collections.unmodifiableList(list);
System.out.println("Read-Only: " + readOnlyList);
// ทดสอบการแก้ไข
try {
readOnlyList.add("CoffeeScript"); // Exception!
} catch (UnsupportedOperationException e) {
System.out.println("Cannot modify read-only list: " + e.getMessage());
}
}
}
ผลลัพธ์
Original: [JavaFx, Java, WebGL, OpenCV] Read-Only: [JavaFx, Java, WebGL, OpenCV] Cannot modify read-only list: null
ข้อสังเกตสำคัญ
- เป็น View ไม่ใช่ Copy -> หาก
listต้นทางเปลี่ยนreadOnlyListจะเห็นการเปลี่ยนแปลง - ป้องกันการ Mutate ผ่าน View นี้เท่านั้น (add, remove, set, clear)
- Iterator ของ View ก็ Remove ไม่ได้
ทางเลือกที่ดีกว่า (Java 10+): Immutable Copy
// สร้าง Immutable List จริง (Copy ข้อมูล แยกจากต้นทาง)
List<String> immutableList = List.copyOf(list);
// หรือ
List<String> immutableList = List.of("JavaFx", "Java", "WebGL", "OpenCV");
| ลักษณะ | Collections.unmodifiableList() | List.copyOf() / List.of() |
|---|---|---|
| Type | View (Backed by Original) | Immutable Copy (Independent) |
| สะท้อนการเปลี่ยนแปลงต้นทาง | ใช่ | ไม่ |
| Null Elements | อนุญาต | ห้าม (NPE) |
| Performance | O(1) Wrapper | O(n) Copy |
สรุป
- ต้องการ View อ่านอย่างเดียว ควบคุมการ Mutate ผ่าน Reference นี้ ->
Collections.unmodifiableList() - ต้องการ Immutable List จริง ปลอดภัยจากการเปลี่ยนแปลงภายนอก ->
List.copyOf()(Java 10+)