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 เดียวกัน