Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

วิธีทำให้ ArrayList เป็น Read-Only ใน Java

ใช้ 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+)