นากกายต้นฉบับกำลังวางบัตรสถานะลงช่องตารางที่เรียงตามลำดับคงที่

Java EnumMap: ทำตารางสถานะให้คีย์ครบและไม่รับ null key

พี่โชว์Engineering

เมื่อคีย์เป็น enum อยู่แล้ว HashMap ไม่ได้สื่อขอบเขตว่ามีคีย์เป็นไปได้กี่แบบครับ EnumMap เก็บคีย์ enum ชนิดเดียว เรียง iteration ตามลำดับที่ประกาศ และไม่รับ null key

import java.util.EnumMap;

public class Main {
    enum Stage { QUEUED, RUNNING, DONE }

    public static void main(String[] args) {
        EnumMap<Stage, Integer> counts = new EnumMap<>(Stage.class);
        for (Stage stage : Stage.values()) counts.put(stage, 0);
        counts.compute(Stage.RUNNING, (key, value) -> value + 1);

        assert counts.size() == Stage.values().length;
        assert counts.get(Stage.RUNNING) == 1;
        assert counts.keySet().iterator().next() == Stage.QUEUED;
        System.out.println("EnumMap tests passed");
    }
}

EnumMap เร็วและกะทัดรัดเพราะใช้โครงสร้างตาม ordinal ภายใน แต่ไม่ควร serialize ordinal เป็น contract ภายนอก เพราะการแทรก enum ใหม่ตรงกลางเปลี่ยนหมายเลขได้ หากทุกสถานะต้องมีค่า ให้เติมจาก Stage.values() แล้ว assert ความครบ ไม่ปล่อย get() คืน null แบบกำกวม

Recap

  • ใช้ EnumMap เมื่อ key domain เป็น enum ชนิดเดียว
  • เติมหรือ validate ทุกสถานะเมื่อ contract ต้องครบ
  • อย่าใช้ ordinal เป็น wire/storage ID
  • synchronize ภายนอกเมื่อมีหลาย thread แก้ map เดียวกัน