คลาส 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 จริงๆ (ปลอดภัยกว่า)