นากต้นฉบับวางของเป็นคู่ในช่องตู้หลายช่องที่ปิดฝาเรียบร้อย

Java Map.ofEntries: สร้าง immutable map หลายคู่โดยไม่เปิดช่องให้แก้ทีหลัง

น้องกายEngineering

ตารางค่าคงที่หลายคู่มักเริ่มจาก HashMap แล้ว put ทีละบรรทัด แต่ object ที่ได้ยังแก้ได้ และผู้อ่านต้องไล่ดูว่ามีใครเพิ่มค่าหลังสร้างหรือไม่ Map.ofEntries ทำให้ intent ว่า “สร้างครบแล้วและไม่อนุญาตแก้” อยู่ตรงจุดประกาศครับ

WHY: immutable ตั้งแต่กำเนิดดีกว่าห้ามด้วยคำพูด

เหมือนจัดของเป็นคู่ลงตู้โชว์แล้วล็อกฝา คนรับช่วงรู้ทันทีว่าเป็น reference data ไม่ใช่กระดานจดร่วม Map.of รองรับจำนวนคู่แบบ overload หลายแบบ ส่วน Map.ofEntries อ่านง่ายเมื่อมีคู่มากหรือประกอบจาก Map.entry

import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> retryByTier = Map.ofEntries(
            Map.entry("free", 1),
            Map.entry("team", 3),
            Map.entry("critical", 5)
        );

        assert retryByTier.size() == 3;
        assert retryByTier.get("team") == 3;

        boolean rejectedMutation = false;
        try {
            retryByTier.put("custom", 9);
        } catch (UnsupportedOperationException expected) {
            rejectedMutation = true;
        }
        assert rejectedMutation;
    }
}

factory นี้ปฏิเสธ null key, null value และ key ซ้ำทันที จึงช่วยจับ config ผิดตอนสร้าง แต่อย่าสับสน “map แก้ไม่ได้” กับ “object ข้างใน immutable” ถ้า value เป็น list ที่ยังแก้ได้ คนเรียกยังเปลี่ยน list นั้นได้ ควร copy value หรือใช้ immutable type ตาม boundary

ลำดับและ performance

เอกสารไม่รับประกัน iteration order ดังนั้นห้ามใช้ Map.ofEntries เมื่อ output ต้องเรียงตาม insertion order ให้ใช้ LinkedHashMap แล้วห่อหรือ copy ตาม contract ที่ชัด สำหรับ lookup table ขนาดเล็ก factory เหมาะและกระชับ แต่ถ้าข้อมูลมาจาก runtime หรือมี key ซ้ำที่ต้อง merge, collector หรือ builder จะสื่อกติกาได้ดีกว่า

การได้ UnsupportedOperationException ตอน mutate เป็น safety net ไม่ใช่ flow ปกติ API ที่ต้องแก้ข้อมูลควรรับ HashMap copy ตั้งแต่แรก แทนการลอง put แล้วจับ exception

Recap

  • ใช้กับตารางคงที่ที่ไม่มี null หรือ duplicate key
  • อย่าพึ่ง iteration order
  • immutable map ไม่ได้ทำให้ value ข้างใน immutable
  • ใช้ mutable copy เมื่อ workflow ต้องเพิ่มหรือลบจริง