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

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

คลาส java.util.Collections มีเมธอด unmodifiableXxx() สำหรับสร้าง Unmodifiable View (มุมมองอ่านอย่างเดียว) ของ Collection ต่างๆ หากพยายามแก้ไขจะโยน UnsupportedOperationException

เมธอดหลัก

เมธอด คำอธิบาย
unmodifiableCollection(Collection<? extends T> c) คืน Collection อ่านอย่างเดียว
unmodifiableList(List<? extends T> list) คืน List อ่านอย่างเดียว
unmodifiableMap(Map<? extends K, ? extends V> m) คืน Map อ่านอย่างเดียว
unmodifiableSet(Set<? extends T> s) คืน Set อ่านอย่างเดียว
unmodifiableSortedMap(SortedMap<K, ? extends V> m) คืน SortedMap อ่านอย่างเดียว
unmodifiableSortedSet(SortedSet<T> s) คืน SortedSet อ่านอย่างเดียว

ตัวอย่างการใช้งาน

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ReadOnlyCollection {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("JavaFx");
        list.add("Java");
        list.add("WebGL");
        list.add("OpenCV");
        
        System.out.println("Original: " + list);
        
        // สร้าง Read-Only View
        List<String> readOnlyList = Collections.unmodifiableList(list);
        System.out.println("Read-Only: " + readOnlyList);
        
        // พยายามเพิ่มข้อมูล -> Exception
        readOnlyList.add("CoffeeScript"); // UnsupportedOperationException
    }
}

ผลลัพธ์ (Runtime Exception)

Original: [JavaFx, Java, WebGL, OpenCV]
Read-Only: [JavaFx, Java, WebGL, OpenCV]
Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.Collections$UnmodifiableCollection.add(...)

ข้อสังเกตสำคัญ

  • เป็น View ไม่ใช่ Copy ข้อมูล จึงสะท้อนการเปลี่ยนแปลงของ Collection ต้นทาง (ถ้าต้นทางเปลี่ยน View ก็เปลี่ยนตาม)
  • ป้องกันการแก้ไขผ่าน View นี้เท่านั้น ไม่ได้ป้องกันการแก้ไขผ่าน Reference เดิม
  • Java 10+ มี List.copyOf(), Set.copyOf(), Map.copyOf() ที่สร้าง Immutable Copy จริงๆ (ปลอดภัยกว่า)