กล่องลิสต์ต้นทางและสำเนาแข็งบนโต๊ะมิ้นต์ มีแม่กุญแจสีอำพันที่สำเนา

Java List.copyOf — สแนปช็อตลิสต์แบบอ่านอย่างเดียวในคำสั่งเดียว

น้องกายEngineering

เวลาคืนลิสต์จากเมธอดแล้วกลัวคนเรียก .add() ใส่ต่อ — ผมเคยห่อ Collections.unmodifiableList(new ArrayList<>(src)) จนโค้ดยาวครับ

List.copyOf(collection) สร้างลิสต์ immutable ที่เป็นสแนปช็อตของสมาชิกตอนเรียก (API)

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

public class Main {
    public static void main(String[] args) {
        var live = new ArrayList<String>();
        live.add("a");
        live.add("b");
        List<String> snap = List.copyOf(live);
        live.add("c");
        assert snap.equals(List.of("a", "b")) : snap;
        boolean rejected = false;
        try {
            snap.add("x");
        } catch (UnsupportedOperationException expected) {
            rejected = true;
        }
        assert rejected : "snap must be unmodifiable";
        System.out.println("List.copyOf snapshot verified");
    }
}

ห้ามมี null ในสมาชิก — copyOf โยน NullPointerException ถ้าเจอ null

Recap

  • แทนที่ unmodifiableList(new ArrayList<>(…)) ด้วย List.copyOf เมื่อต้องการสแนปช็อต
  • เช็กว่าข้อมูลไม่มี null
  • ใช้คู่กับ Set.copyOf / Map.copyOf ในสไตล์เดียวกัน
  • รันตัวอย่างบน JDK ที่ทีมใช้จริง